동일한 형식의 두 입력 파일의 첫 번째 열을 비교하려고 합니다. 형식은 다음과 같습니다.
FILE1:
0000abc5abc3 GR096
0000def5ae87 GR001
0000cab5aea3 GR001
0000bac5aeeb GR001
0000fed5af13 GR001
0000efd5b16f GR001
0000cba5b187 GR001
0000bca5b2a3 GR001
FILE2:
0000abc5abc3 GR097
0000def5ae87 GR001
0000cab5aea3 GR001
0000bac5aeeb GR001
0000fed5af13 GR123
0000cba5b187 GR169
열 1에는 FILE1 및 FILE2의 MAC 주소가 포함됩니다. FILE1의 1열 값을 FILE2의 1열과 비교하여 일치하는 항목이 있으면 FILE1의 1열과 2열의 값과 FILE2의 2열의 값이 3개의 열로 출력되도록 하고 싶습니다.
DESIRED OUTPUT:
0000abc5abc3 GR096 GR097
0000def5ae87 GR001 GR001
0000cba5b187 GR001 GR169
각 파일에는 수백만 개의 항목이 포함되어 있습니다. while 루프를 사용하여 bash에서 입력을 실행하는 것은 각 항목을 반복하기 때문에 항상 느리고 비효율적입니다.
while read -r mac1 code1; do
while read -r mac2 code2 ; do
if [ "$mac1" == "$mac2" ]; then
printf "%s %s %s\n" "$mac1" "$code1" "$code2"
fi
done < "$FILE1"
done < "$FILE2" > OUTPUTFILE
배열을 사용하면 Awk가 훨씬 빠르지만 다음 구문을 사용하면 FILE2의 두 번째 열을 출력의 세 번째 열에 인쇄할 수 없습니다. 이 구문은 열 2만 두 번째로 인쇄합니다.
awk 'NR==FNR { n[$1] = $1; n[$2] = $2; next } ($1 in n) { print n[$1],n[$2],$2 }'
나는 AWK를 선호하지만 bash에서 그만큼 빠르게 실행된다면 괜찮을 것입니다.
요약: file1의 1열 값이 file2에서 발견되면 1열, 2열(파일 1), 2열(파일 2)의 값을 출력합니다.
답변1
출력을 정렬할 수 있는 경우:
join <(sort file1.txt) <(sort file2.txt)
답변2
awk를 수정하려면 다음을 수행하십시오.
awk 'NR==FNR { n[$1]=$0;next } ($1 in n) { print n[$1],$2 }' file1 file2
#Output:
0000abc5abc3 GR096 GR097
0000def5ae87 GR001 GR001
0000cab5aea3 GR001 GR001
0000bac5aeeb GR001 GR001
0000fed5af13 GR001 GR123
0000cba5b187 GR001 GR169
답변3
join
이를 수행하는 데 적합한 도구는 다음과 같습니다.
join <(sort file1) <(sort file2)
정렬된 파일에서 작동하기 때문에 bash의 프로세스 대체( <(...)
)를 사용하여 각 파일을 join
.