한 파일의 필드가 다른 파일에 있는지 확인하고 첫 번째 파일의 특정 열을 업데이트합니다.

한 파일의 필드가 다른 파일에 있는지 확인하고 첫 번째 파일의 특정 열을 업데이트합니다.

다음과 같이 2개의 파일이 있습니다.

a.txt(탭으로 구분됨, 열이 3개이고 행이 너무 많음):

 city   plate   region
 istanbul   36  marmara
 trabzon    61  karadeniz

b.txt(쉼표로 구분, 4개의 열 및 너무 많은 행):

name,city,age,nationality
mehmet,trabzon,,
murat,istanbul,,
john,london,,

내가 원하는 것은 city두 번째 열(필드)이 (첫 번째 열 - ) b.txt에 있는지 확인하고 파일 이 존재하는 경우 파일을 업데이트 하고 네 번째 열( )을 "터키어"로 설정하는 것입니다. 따라서 예상되는 결과는 다음과 같습니다.a.txtcitya.txtb.txtnationality

name,city,age,nationality
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,

다음 명령을 시도했지만 원하는 출력이 생성되지 않았습니다.

nawk 'BEGIN { FS = "\t" } FNR == NR {x[$1] = $1; next;} {FS=OFS=","} FNR>1{if ($2 in x) {($4 = "turkish")} } 1' a.txt b.txt
name,city,age,nationality
mehmet,trabzon,,
murat,istanbul,,
john,london,,

내 명령에서 오류를 찾아야 합니다.

답변1

스크립트가 정상적으로 실행됩니다. 내 생각엔 첫 번째 파일에 탭 대신 구분 기호로 공백이 있는 것 같습니다.

쓸모없는 것들을 제거 BEGIN { FS = "\t" }하고 그것이 사실인지 확인하십시오.

답변2

사용해 보세요sed

sed -n 's|\(.*\S\)\s\+[0-9].*|/\1/s/$/turkish/|p' a.txt |
sed -f - b.txt

답변3

사용 awk(첫 번째 파일이 a.txt메모리에 완전히 로드되어야 함):

awk -F"[\t, ]" 'FNR==NR&&NR!=1{a[$1]="turkish"}
  FNR!=NR{OFS=",";if(FNR!=1){$NF=a[$2]};print}' a.txt b.txt

  • -F"[\t,]"awks 구분 기호를 탭과 쉼표로 설정
  • FNR==NR&&NR!=1첫 번째 파일에서만 작동 a.txt하고 첫 번째 줄(헤더)은 무시합니다.
    • a[$1]="turkish"a첫 번째 필드 인덱스라는 배열에 설정$1
  • FNR!=NR두 번째 파일에서만 작동합니다.b.txt
  • OFS=","출력 필드 구분 기호 설정
  • if(FNR!=1)헤더 행이 아닌 경우에만 작업을 수행하세요.
  • $NF=a[$2]turkish마지막 필드가 배열에 존재하는 경우 이전에 저장된 값으로 설정합니다.
  • print값이 존재하는지 여부에 따라 줄을 인쇄합니다.

산출:

name,city,age,nationality
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,

답변4

tr   -s \[:blank:] , <a.txt|    #dont mess with weird columns
cut  -d, -f1  |  sort -u   |    #drop all but unique first column entries
sed  -e's/[]*^\./$[]/\\&/g'\    #handle any regex metachars properly
     -e's/.*/^[^,]*,&,/'   |    #match only second column
grep -nf - -- b.txt        |    #get line numbers at head of matched lines
sed  -e's/:.*/be/'         |    #keep only matched line numbers + 'be'
sed  -f - -eb -e:e         \    #branch away or append turkish
     -e's/$/turkish/' -- b.txt

mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,

관련 정보