在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) 的结果创建逻辑数组
- 我们使用逻辑数组来创建输出
- 打印输出并读取下一个块
由于您的文件已排序并包含所有行,因此相当简单。