저는 awk와 shell을 처음 접했고 shell/awk를 사용하여 두 파일을 동일한 레코드가 있는 줄로 병합하는 방법을 알고 싶습니다. file1과 file2의 이름 순서는 다를 수 있습니다. 동일한 레코드가 있는 행만 병합하고 싶습니다. 도와주세요.
file1.txt
Mary 68
Tom 50
Jason 45
Lu 66
file2.txt
Jason 37
Tom 26
Mary 74
Tina 80
mergefile.txt
Marry 68 74
Tom 50 26
Jason 45 37
awk를 시도했지만 스크립트를 실행하는 데 시간이 좀 걸립니다. 더 빠르고 쉬운 도구가 있는지 궁금합니다.
cat file1.txt | while read line
do
score1=$( echo $line | awk '{print $2}');
name1=$( echo $line | awk '{print $1}');
cat file2.txt | while read l
do
score2=$( echo $l | awk '{print $2}');
name2=$( echo $l | awk '{print $1}');
if [[ $name1 == $name2 ]]
then
echo "$name1 $score1 $score2" >> mergefile
break
fi
done
done
답변1
awk를 사용하려면:
$ awk 'NR==FNR {a[$1] = $2; next} $1 in a {print $1, $2, a[$1]}' file2.txt file1.txt
Mary 68 74
Tom 50 26
Jason 45 37
정렬은 필요하지 않으며 두 번째 파일에 지정된 순서대로 출력됩니다.
설명하다:
NR==FNR
첫 번째 명명된 파일에서 레코드를 선택하는 정식 방법입니다.{a[$1] = $2; next}
첫 번째 필드의 키와 두 번째 필드의 값으로 배열을 채웁니다.$1 in a
첫 번째 필드가 첫 번째 파일에 이미 표시되어 있는 경우;{print $1, $2, a[$1]}
두 번째 파일의 키와 값, 첫 번째 파일의 값을 인쇄합니다.
답변2
이건 직업인 것 같아join
, 관계형 데이터베이스 운영자
join <(sort file1.txt) <(sort file2.txt)
시험
$ cat file1.txt
Mary 68
Tom 50
Jason 45
Lu 66
$ cat file2.txt
Jason 37
Tom 26
Mary 74
Tina 80
$ join <(sort file1.txt) <(sort file2.txt)
Jason 45 37
Mary 68 74
Tom 50 26
join
POSIX에 명시된 표준 도구입니다.
매뉴얼 join
페이지에는 다음과 같이 명시되어 있습니다.
The files file1 and file2 shall be ordered in the collating sequence of sort -b on the fields on which they shall be joined, by default the first in each line. All selected output shall be written in the same collating sequence.