awk extrae columnas que cumplen la condición

awk extrae columnas que cumplen la condición

Estoy escribiendo un script para preparar un archivo csv que toma las columnas número 5, 6, 7, 8, 10 y 13; toma las filas que en la columna 44 son iguales a 7 y también cumple que las filas que en la columna 3 son iguales a 1, al mismo tiempo.

Aporte:

"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"

Producción:

"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"

Por el momento, en mi script tengo:

#!/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}
}

Pero no estoy seguro de la última parte. Entonces mi pregunta sería, ¿cómo extraigo solo las filas que cumplen estas condiciones: ($44 == 7)y ($3 == 1)?

Respuesta1

Una nota inicial: ninguna de las 44 celdas del campo es igual a 7. Tienes 07.

Esto no está mal, esMolinero, creo que podría ser útil

mlr --csv  -N filter -S '$3=="1" && $44=="07" || $1=~"ID"' then cut -f 5,6,7,8,10,13  input.csv >outuput.csv

Algunos comentarios:

  • filterfiltrar usando sus condiciones y tener en la salida la fila de encabezado;
  • cutpara extraer los campos que quieras

En la salida tendrás

Codi_Sector_Activitat Nom_Sector_Actividad Codi_Grup_Activitat Nom_Grup_Activitat Nom_Activitat SN_Oci_Nocturno
2 serviris 14 Restaurantes, bares y hoteles (Inclòs hostales, pensiones y fondes) Restaurantes 1

Respuesta2

Puede agrupar todas las condiciones en una regla de patrón; sin embargo, tenga en cuenta que, dado que todos sus campos CSV están entre comillas, debe tenerlo en cuenta en el patrón, por ejemplo.

$ cat prepare.awk
#!/bin/awk -f

BEGIN { FS = OFS = "," }

NR == 1 || $44 == "\"7\"" || $3 == "\"1\"" {
  print $5, $6, $7, $8, $10, $13
}

Entonces

$ ./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"

Tenga en cuenta que todas las filas que no son de encabezado en su entrada de muestra están "1"en la tercera columna.

Si desea seleccionar filas dondeambosLas condiciones que no son de encabezado coinciden, cambie la condición a

NR == 1 || ( $44 == "\"7\"" && $3 == "\"1\"" )

información relacionada