![2개의 파일을 비교하여 일치하지 않는 레코드의 줄 번호와 일치하지 않는 각 레코드의 열 번호를 TEST2.txt에 인쇄합니다.](https://linux55.com/image/106086/2%EA%B0%9C%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B9%84%EA%B5%90%ED%95%98%EC%97%AC%20%EC%9D%BC%EC%B9%98%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EB%A0%88%EC%BD%94%EB%93%9C%EC%9D%98%20%EC%A4%84%20%EB%B2%88%ED%98%B8%EC%99%80%20%EC%9D%BC%EC%B9%98%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EA%B0%81%20%EB%A0%88%EC%BD%94%EB%93%9C%EC%9D%98%20%EC%97%B4%20%EB%B2%88%ED%98%B8%EB%A5%BC%20TEST2.txt%EC%97%90%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
TEST1.txt에서
ID_ID First_name Last_name Address Contact_Number
ID1 John Rock 32, Park Lake, California 2222200000
ID2 Tommy Hill 5322 Otter Lane Middleberge 3333300000
ID3 Leonardo Test Half-Way Pond, Georgetown 4444400000
ID8 Rhyan Bigsh 6762,33 Ave N,St. Petersburg 5555500000
ID50 Steve Goldberg 6762,33 Ave N,St. Petersburg 6666600000
&&
TEST2.txt에서
ID_ID First_name Last_name Address Contact_Number
ID1 John Rock 32, Park Lake, California 2222200000
ID2 Tommy1 Hill1 5322 Otter Lane Middleberge 3333300000
ID3 Leonardo Test Half-Way Pond, Georgetown 4444400000
ID80 Sylvester Stallone 5555500000
ID50 Steve Goldberg 6762,33 Ave N,St. Petersburg 6666600000
ID60 Mark Waugh St. Petersburg 7777700000
원하는 결과:-
TEST2.txt의 차이점은 행 번호와 열 번호(값이 일치하지 않는 곳)입니다.
Line No. 2 COLUMN NO 2,3
Line No. 4 COLUNN NO 1,2,3,4
Line No. 6 COLUNN NO 1,2,3,4,5
참고: 비교할 파일 크기는 GB 단위이고 파일은 탭으로 구분되며 탭으로 구분된 열은 250개가 넘습니다.
답변1
서툴지만 효과적이다:
BEGIN {
FS=OFS="\t"
}
NR==FNR {
# 5 = number of columns
for (i=0;i<=5;i++) {
a[$1,i]=$i }
}
{ if ( a[$1,0] != $0 ) {
b=""
for (i=1;i<=5;i++) {
if ( a[$1,i] != $i ) {
b=b i", "
}
}
print "Line No." FNR," Column No. ",b
}
}
그러나 이를 위해 (예를 들어) FORTRAN 프로그램을 작성하는 것이 좋습니다. 예를 들어 10,000행과 같은 대량의 데이터를 읽을 수 있고 awk
이 솔루션을 사용하려면 RAM에 하나 이상의 파일을 저장해야 하는데 이는 GB 크기에 문제가 될 수 있습니다. 파일. 다음과 같이 보일 수 있습니다:
- 각 파일의 데이터 청크를 배열(행 및 열)로 읽습니다.
- 배열을 비교하고 a(i,j)=b(i,j)의 결과를 사용하여 논리 배열을 만듭니다.
- 출력을 생성하기 위해 논리 배열을 사용합니다.
- 출력을 인쇄하고 다음 블록을 읽습니다.
파일이 정렬되어 있고 모든 줄이 포함되어 있으므로 매우 간단합니다.