Ich schreibe ein Skript zum Vorbereiten einer CSV-Datei, die die Spaltennummern 5, 6, 7, 8, 10 und 13 übernimmt; die Zeilen in Spalte 44 nimmt, die gleich 7 sind, und gleichzeitig sicherstellt, dass die Zeilen in Spalte 3 gleich 1 sind.
Eingang:
"ID_Bcn_2019","ID_Bcn_2016","Codi_Principal_Activitat","Nom_Principal_Activitat","Codi_Sector_Activitat","Nom_Sector_Activitat","Codi_Grup_Activitat","Nom_Grup_Activitat","Codi_Activitat_2019","Nom_Activitat","Codi_Activitat_2016","Nom_Local","SN_Oci_Nocturn","SN_Coworking","SN_Servei_Degustacio","SN_Obert24h","SN_Mixtura","SN_Carrer","SN_Mercat","Nom_Mercat","SN_Galeria","Nom_Galeria","SN_CComercial","Nom_CComercial","SN_Eix","Nom_Eix","X_UTM_ETRS89","Y_UTM_ETRS89","Latitud","Longitud","Direccio_Unica","Codi_Via","Nom_Via","Planta","Porta","Num_Policia_Inicial","Lletra_Inicial","Num_Policia_Final","Lletra_Final","Solar","Codi_Parcela","Codi_Illa","Seccio_Censal","Codi_Barri","Nom_Barri","Codi_Districte","Nom_Districte","Referencia_cadastral","Data_Revisio"
1059038,"68849","1","Actiu","2","Serveis","14","Restaurants, bars i hotels (Inclòs hostals, pensions i fondes)","1400002","Restaurants","1400002","QUATRE COSES","1","1","1","1","1","0","1","","1","","1","","0","Rambla Catalunya","430088.542","4582365.352","41.38978196","2.16378361","089004, 329-329, LOC 10","089004","CONSELL DE CENT","LOC","10","329","","329","","114142","019","60490","079","07","la Dreta de l'Eixample","02","Eixample","0125419DF3802E","20190509"
1075454,"","1","Actiu","2","Serveis","16","Altres","1600400","Serveis a les empreses i oficines","16004","SORIGUE","1","1","1","1","1","0","1","","1","","1","","1","","427229.272","4577543.637","41.34610100","2.13016600","222206, 19-19, LOC 10","222206","MOTORS","LOC","10","19","","19","","","","","025","12","la Marina del Prat Vermell","03","Sants-Montjuïc","","20190925"
1075453,"","1","Actiu","2","Serveis","16","Altres","1600102","Activitats emmagatzematge","1600102","CEJIDOS SIVILA S.A","1","1","1","1","1","0","1","","1","","1","","1","","427178.393","4577526.160","41.34593900","2.12956000","222206, 278-282, LOC 10","222206","MOTORS","LOC","10","278","","282","","","","","025","12","la Marina del Prat Vermell","03","Sants-Montjuïc","","20190925"
Ausgabe:
"Codi_Sector_Activitat","Nom_Sector_Activitat","Codi_Grup_Activitat","Nom_Grup_Activitat","Nom_Activitat","SN_Oci_Nocturn"
"2","Serveis","14","Restaurants, bars i hotels (Inclòs hostals, pensions i fondes)","Restaurants","1"
Im Moment habe ich in meinem Skript:
#!/bin/awk -f
BEGIN { FS = OFS = "," }
NR == 1 { print $5, $6, $7, $8, $10, $13 }
NR != 1 {
if ($44 == 7) {print}
if ($3 == 1) {print}
}
Aber beim letzten Teil bin ich mir nicht sicher. Meine Frage wäre also, wie ich nur die Zeilen extrahiere, die diese Bedingungen erfüllen: ($44 == 7)
und ($3 == 1)
?
Antwort1
Eine Anmerkung vorab: Keine der 44 Feldzellen ergibt die Zahl 7. Sie haben 07
.
Das ist nicht awk, es istMüller, ich denke, es könnte nützlich sein
mlr --csv -N filter -S '$3=="1" && $44=="07" || $1=~"ID"' then cut -f 5,6,7,8,10,13 input.csv >outuput.csv
Einige Kommentare:
filter
um mit Ihren Bedingungen zu filtern und in der Ausgabe die Überschriftenzeile zu haben;cut
, um die gewünschten Felder zu extrahieren
Als Ausgabe haben Sie
Codi_Sector_Activitat | Nom_Sector_Activitat | Codi_Grup_Activitat | Nom_Grup_Activitat | Nom_Activitat | SN_Oci_Nocturn |
---|---|---|---|---|---|
2 | Serveis | 14 | Restaurants, Bars und Hotels (einschließlich Hostels, Pensionen und Fonds) | Restaurants | 1 |
Antwort2
Sie können alle Bedingungen in einer Musterregel zusammenfassen. Beachten Sie jedoch, dass Sie dies im Muster berücksichtigen müssen, da Ihre CSV-Felder alle in Anführungszeichen stehen, z. B.
$ cat prepare.awk
#!/bin/awk -f
BEGIN { FS = OFS = "," }
NR == 1 || $44 == "\"7\"" || $3 == "\"1\"" {
print $5, $6, $7, $8, $10, $13
}
Dann
$ ./prepare.awk Input
"Codi_Sector_Activitat","Nom_Sector_Activitat","Codi_Grup_Activitat","Nom_Grup_Activitat","Nom_Activitat","SN_Oci_Nocturn"
"2","Serveis","14","Restaurants, pensions i fondes)","1400002"
"2","Serveis","16","Altres","Serveis a les empreses i oficines","1"
"2","Serveis","16","Altres","Activitats emmagatzematge","1"
Beachten Sie, dass sich alle Zeilen ohne Überschriften in Ihrer Beispieleingabe "1"
in der 3. Spalte befinden.
Wenn Sie Zeilen auswählen möchten, in denenbeideBedingungen, die nicht mit dem Header übereinstimmen, ändern Sie die Bedingung in
NR == 1 || ( $44 == "\"7\"" && $3 == "\"1\"" )