조건을 충족하는 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 레스토랑, 바, 호텔(Inclòs Hostals, Pensions i fondes) 레스토랑 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\"" )

관련 정보