Ho un file csv in cui ogni riga definisce una stanza in un determinato edificio. Insieme alla stanza, ogni fila ha un campo di pavimento. Quello che voglio estrarre sono tutti i piani di tutti gli edifici.Analizza un csv usando awk e ignorando le virgole all'interno di un campo
Il mio file si presenta così ...
"u_floor","u_room","name"
0,"00BDF","AIRPORT TEST "
0,0,"BRICKER HALL, JOHN W "
0,3,"BRICKER HALL, JOHN W "
0,5,"BRICKER HALL, JOHN W "
0,6,"BRICKER HALL, JOHN W "
0,7,"BRICKER HALL, JOHN W "
0,8,"BRICKER HALL, JOHN W "
0,9,"BRICKER HALL, JOHN W "
0,19,"BRICKER HALL, JOHN W "
0,20,"BRICKER HALL, JOHN W "
0,21,"BRICKER HALL, JOHN W "
0,25,"BRICKER HALL, JOHN W "
0,27,"BRICKER HALL, JOHN W "
0,29,"BRICKER HALL, JOHN W "
0,35,"BRICKER HALL, JOHN W "
0,45,"BRICKER HALL, JOHN W "
0,59,"BRICKER HALL, JOHN W "
0,60,"BRICKER HALL, JOHN W "
0,61,"BRICKER HALL, JOHN W "
0,63,"BRICKER HALL, JOHN W "
0,"0006M","BRICKER HALL, JOHN W "
0,"0008A","BRICKER HALL, JOHN W "
0,"0008B","BRICKER HALL, JOHN W "
0,"0008C","BRICKER HALL, JOHN W "
0,"0008D","BRICKER HALL, JOHN W "
0,"0008E","BRICKER HALL, JOHN W "
0,"0008F","BRICKER HALL, JOHN W "
0,"0008G","BRICKER HALL, JOHN W "
0,"0008H","BRICKER HALL, JOHN W "
Quello che voglio è tutti i piani di tutti gli edifici.
Sto usando cat, awk, sort e uniq per ottenere questo elenco anche se ho un problema con il "," nel campo del nome dell'edificio come "BRICKER HALL, JOHN W" e sta buttando via il mio intero generazione csv.
Come posso ottenere awk per utilizzare la virgola ma ignorare una virgola tra "" di un campo? In alternativa, qualcuno ha una soluzione migliore?
Sulla base della risposta fornita suggerendo un parser awk csv ero in grado di ottenere la soluzione:
cat Buildings.csv | awk -f csv.awk | awk -F" -> 2|" '{print $2}' | awk -F"|" '{print $2","$3}' | sort | uniq > floors.csv
Non vogliamo usare il programma csv awk e poi da lì che voglio usare un "-> 2 |" che è una formattazione basata sul programma csv awk. La stampa $ 2 stampa solo il contenuto analizzato csv, questo perché il programma stampa la riga originale seguita da "-> #" dove # è il conteggio analizzato da csv. (Cioè le colonne.) Da lì posso dividere questo risultato di awk csv sul "|" con ciò sostituisce la virgola con. Quindi ordina, uniq e condividi un file e fallo!
Grazie per l'aiuto.
Questa grande opera ad eccezione di "csv stampa [1], csv [2]" dovrebbe in realtà essere "csv stampa [0], csv [1]" Grazie! – Chris
Qualche idea su come ottenere awk per eliminare gli spazi bianchi extra sui campi e non utilizzare una larghezza fissa? "TEST AEROPORTO" Voglio essere "TEST AEROPORTO" – Chris
@Chris: lo spazio bianco è una domanda separata, perché se stampo csv [0], csv [1] 'ottengo" 0 00BDF "anziché" AIRPORT TEST " ? –