다른 파일을 참조하여 행 업데이트

다른 파일을 참조하여 행 업데이트

아래에 언급된 것처럼 쉼표로 구분된 두 개의 파일이 있습니다.

cat source.txt
A,1000
B,3000
C,2500
D,5000
E,4000
F,3000

cat test.txt
A,1000
C
D,5000
B
E

예상 출력이 다음과 같도록 source.txt 파일을 참조하여 test.txt 파일을 업데이트하려면 어떻게 해야 합니까?

cat test.txt
A,1000
C,2500
D,5000
B,3000
E,4000

답변1

노력하다:

$ awk -F, -v OFS=, 'FNR==NR{a[$1]=$2; next} NF==1{$2=a[$1]} 1' source.txt test.txt 
A,1000
C,2500
D,5000
B,3000
E,4000

작동 방식:

  1. -F, -v OFS=,

    그러면 입력 및 출력 필드 구분 기호가 쉼표로 설정됩니다.

  2. FNR==NR{a[$1]=$2; next}

    첫 번째 파일을 읽을 때 source.txt두 번째 필드의 값을 $2첫 번째 필드 키 아래의 연관 배열에 저장합니다. 그런 다음 나머지 명령을 건너뛰고 점프하여 다시 시작하세요.a$1next

  3. NF==1{$2=a[$1]}

    현재 행에 필드가 하나만 있는 경우 두 번째 필드를 연관 배열의 값에 할당합니다 a.

  4. 1

    이것은 약어입니다이 줄을 인쇄하세요.

파일을 영구적으로 변경합니다.

모든 버전의 awk에서 다음 명령을 사용하여 파일을 영구적으로 업데이트할 수 있습니다 test.txt(권장).

awk -F, -v OFS=, 'FNR==NR{a[$1]=$2; next} NF==1{$2=a[$1]} 1' source.txt test.txt >temp && mv temp test.txt

또는 최신 버전의 GNU awk(GNU라고도 함 gawk)를 사용하는 경우:

awk -i inplace -F, -v OFS=, 'FNR==NR{a[$1]=$2; print; next} NF==1{$2=a[$1]} 1' source.txt test.txt

답변2

아래와 같이 해봤는데 잘 되더라구요

주문하다:

for i in `awk -F "," '{print $1}' file2`; do k=`awk -F "," -v i="$i" '$1 == i {print $2}' file1`; echo $i;echo $k;done| sed "N;s/\n/,/g"

산출

A,1000
C,2500
D,5000
B,3000
E,4000

관련 정보