두 개의 파일이 있습니다. 한 파일의 내용을 다른 파일의 내용과 비교하고 싶습니다. 두 파일 사이에 일치하는 줄이 있으면 각 파일의 줄과 줄 번호를 인쇄합니다. 예:
파일 1:
ABC
PQR
MNO
XYZ
파일 2:
qqqq
wewe
ABC
acdd
abcc
nop
MNO
예상 출력:
ABC 1 3
MNO 3 7
..
답변1
awk
첫 번째 파일을 처리하고 행( )과 해당 행 번호( )(인덱스/값)를 연관 배열( )에 저장한 다음 $0
두 NR
번째 l[$0]
파일을 처리하고 행이 배열 인덱스에 있는 경우 인쇄된 값은 l[$0]
현재 줄 번호( FNR
)입니다.
awk 'FNR==NR{l[$0]=NR; next}; $0 in l{print $0, l[$0], FNR}' file1 file2
답변2
#!/bin/sh
count_match() {
grep -x -n -F -f "$1" "$2" | sed 's/\([0-9]*\):\(.*\)/\2 \1/' | sort
}
count_match file2 file1 > /tmp/$$A
count_match file1 file2 > /tmp/$$B
join /tmp/$$[AB]
rm /tmp/$$[AB]
grep
사용되는 옵션은 다음과 같습니다 .
-n
일치하는 줄 번호 인쇄
-x
전체 줄과 일치
-F
리터럴 문자열만 일치 - 정규식 없음
-f filename
파일에서 검색 패턴 읽기(이 경우 file1 또는 file2)
sed
필드 순서를 전환하고 콜론을 제거하는 데 사용됩니다 :
.
sort
산출.
join
두 임시 파일의 내용입니다.
이는 위 예에서 명령의 사용법과 출력을 보여줍니다.
$ grep -n -F -f file2 file1
1:ABC
3:MNO
$
$ grep -x -n -F -f file2 file1 | sed 's/\([0-9]*\):\(.*\)/\2 \1/'
ABC 1
MNO 3
$
$ grep -x -n -F -f file1 file2 | sed 's/\([0-9]*\):\(.*\)/\2 \1/'
ABC 3
MNO 7
$