다음과 같이 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.txt
city
a.txt
b.txt
nationality
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,,