awk는 조건을 충족하는 열을 추출합니다.

awk는 조건을 충족하는 열을 추출합니다.

5, 6, 7, 8, 10, 13열을 사용하는 csv 파일을 준비하는 스크립트를 작성 중입니다. 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.

이건 별거 아니지만밀러, 내 생각엔 이게 유용할 것 같아

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_녹턴
2 제공하다 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"세 번째 열에 있습니다.

행을 선택하고 싶다면둘 다헤더가 아닌 조건이 일치합니다. 조건을 다음으로 변경하세요.

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

관련 정보