아래와 같이 fileA.txt가 있습니다.
title trial_exp values
Version 1.0
Blank1 0.010
Blank2 0.200
Blank3 0.100
Test_field_Asia 1.500
Test_field_Europe 0.900
Test_field_America 2.000
그런 다음 다음과 같은 fileB.txt가 있습니다.
Test_field_Asia Thailand
Test_field_Europe UK
Test_field_America Mexico
fileA의 열 1에 있는 모든 이름을 fileB의 열 1에 있는 이름과 일치시키고 일치하는 항목이 발견되면 열 2의 값을 바꾸려고 합니다.
원하는 출력:
title trial_exp values
Version 1.0
Blank1 0.010
Blank2 0.200
Blank3 0.100
Test_field_Asia Thailand 1.500
Test_field_Europe UK 0.900
Test_field_America Mexico 2.000
다음 코드를 시도했습니다.
awk 'NR==FNR{rec[$1]=$2;next}{temp=$1} temp in rec{$2=rec[temp]}1' fileA.txt fileB.txt
그러나 교체가 완료되지 않았으며 원본 fileA.txt가 인쇄되었습니다.
누군가 이 코드의 문제점을 설명하거나 대체 솔루션을 제안할 수 있습니까?
답변1
이것은해결책.
- 파일 만들기
myscript.sh
#!/bin/bash
awk 'BEGIN{FS=",";OFS="\t"}
FNR==NR{myfile2[$1]=$2; next}
FNR>1{if(myfile2[$1]){print $1, myfile2[$1], $3,NR}else{print $1,$2,$3}}
' fileB.txt fileA.txt
- 실행하세요:
chmod +x myscript.sh
./myscript.sh
다음과 같은 출력을 얻게 됩니다.
Version 1.0
Blank1 0.010
Blank2 0.200
Blank3 0.100
Test_field_Asia Thailand 1.500 9
Test_field_Europe UK 0.900 10
Test_field_America Mexico 2.000 11
- 출력에서 쉼표를 구분 기호로 사용하려면 변경할 수 있습니다.
OFS=","
다음과 같은 출력이 표시됩니다.
Version,1.0,
Blank1,,0.010
Blank2,,0.200
Blank3,,0.100
Test_field_Asia,Thailand,1.500,9
Test_field_Europe,UK,0.900,10
Test_field_America,Mexico,2.000,11
- 임의로 선택할 수 있는.
fileA.txt
제목(첫 번째 줄)을 포함하고 싶은 경우ㅏ)간단히 조건을 변경할 수 있습니다.FNR>=1
또는비)스크립트를 간단히 다시 작성하십시오.
#!/bin/bash
awk 'BEGIN{FS=",";OFS="\t"}
FNR==NR{myfile2[$1]=$2; next}
myfile2[$1]{print $1, myfile2[$1], $3; next;}{print $1,$2,$3}
' fileB.txt fileA.txt
마지막으로 자세한 예를 보려면 다음을 읽어보세요. https://www.baeldung.com/linux/awk-multiple-input-files
답변2
당신이 원하는 것은 본질적으로 데이터베이스 연결입니다. 이를 수행하는 적절한 이름의 명령이 있습니다 join
. 문제는 정렬된 입력이 필요하다는 것입니다. 행 순서가 관련이 없는 경우 다음을 수행할 수 있습니다.
join -a1 <(sort fileA.txt) <(sort fileB.txt)
-a1 옵션은 병합할 수 없는 행을 인쇄합니다. 두 개의 <(...) 구성은 sort 명령의 출력을 포함하는 임시 파일을 생성합니다. 귀하의 예를 사용하면 결과는 다음과 같습니다.
Blank1 0.010
Blank2 0.200
Blank3 0.100
Test_field_America 2.000 Mexico
Test_field_Asia 1.500 Thailand
Test_field_Europe 0.900 UK
title trial_exp values
Version 1.0
(예제를 복사하여 탭을 공백으로 바꿨다는 것을 방금 깨달았습니다.)
이것제목그리고버전행은 헤더일 수 있으므로 일부 후처리가 필요합니다.