awk извлекает столбцы, соответствующие условию

awk извлекает столбцы, соответствующие условию

Я пишу скрипт для подготовки CSV-файла, который берет столбцы с номерами 5, 6, 7, 8, 10 и 13; берет строки, которые в столбце 44 равны 7, а также строки, которые в столбце 3 равны 1, одновременно.

Вход:

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

Выход:

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

На данный момент в моем сценарии есть:

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

Но я не уверен насчет последней части. Поэтому мой вопрос будет таким: как мне извлечь только те строки, которые соответствуют этим условиям: ($44 == 7)и ($3 == 1)?

решение1

Начальная заметка: ни одна из 44 ячеек поля не равна 7. У вас есть 07.

Это не awk, этоМиллер, я думаю, это может быть полезно

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

Некоторые комментарии:

  • filterфильтровать, используя ваши условия, и иметь на выходе строку заголовка;
  • cutдля извлечения нужных вам полей

На выходе вы получите

Codi_Sector_Activitat Nom_Sector_Activitat Codi_Grup_Activitat Nom_Grup_Activitat Nom_Activitat SN_Oci_Nocturn
2 Serveis 14 Рестораны, бары и отели (включая хостелы, пансионы и фонды) Рестораны 1

решение2

Вы можете объединить все условия в одно правило шаблона — однако учтите, что поскольку все поля CSV заключены в кавычки, вам необходимо учесть это в шаблоне, например.

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

BEGIN { FS = OFS = "," }

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

Затем

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

Обратите внимание, что все строки, не являющиеся заголовками, в вашем образце входных данных находятся "1"в 3-м столбце.

Если вы хотите выбрать строки, гдеобаесли условия, не относящиеся к заголовку, совпадают, измените условие на

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

Связанный контент