아래에 언급된 것처럼 쉼표로 구분된 두 개의 파일이 있습니다.
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
작동 방식:
-F, -v OFS=,
그러면 입력 및 출력 필드 구분 기호가 쉼표로 설정됩니다.
FNR==NR{a[$1]=$2; next}
첫 번째 파일을 읽을 때
source.txt
두 번째 필드의 값을$2
첫 번째 필드 키 아래의 연관 배열에 저장합니다. 그런 다음 나머지 명령을 건너뛰고 점프하여 다시 시작하세요.a
$1
next
NF==1{$2=a[$1]}
현재 행에 필드가 하나만 있는 경우 두 번째 필드를 연관 배열의 값에 할당합니다
a
.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