工作原因,要进行数据的比对,找出差异的部分。前面已经说过了,使用awk进行数据比对,非常的方便快捷。我也一直是这样的认为的。昨天下午,要比对的两个数据文件,全部准备好了。可比对,却总是不成功。这也让我很是纳闷。遇到问题也是不停的上网查找,是哪里的原因。发觉互联网,提供你的,很大一部分,都是按照套路来的。重复的信息很多。可有时候,找到适合自己情况的解决方案,很少。
    先说说的工作环境吧,比如,比如我要查找一批手机号。把异常的数据找出来。当然前提是经过我程序的处理,已经有了含有异常的手机号码文件和正常手机号的数据文件。我们很容易想到,将两个文件做减法操作。即可得到异常数据部分。经过自己的摸索,发现还是数据存放格式导致的。
    因为含有异常数据的数据文件,只有一列。而正常手机号的数据文件,有多列,列与列直接的间隔符是tab(\t)。这个时候,你如果还用网上说的哪种方法,你会发现你根本就无法比对处理。因为含有异常数据文件的只有一列。取数据时,会取错。
    找到了,错误的所在,那解决错误的方法,也就很容易找到了。也就是将含有异常数据的数据文件,做成两列,列于列直接的分隔符和含有正常手机号的数据文件的列分隔符一致。再用awk进行比较。就OK了。
比如我的含有错误手机号码的数据文件内容如下:
$ cat tmp/serial_number.out
15617831910
15617831790
13043795558
13137180868
13203732017
13203731261
13203731057
13203735739
13203731607
13203732336
13203733887
13140590497
13233844955
15517338450
15565227246
15517336724
13140598206
15516456326
15560158504
15560158934
15565822773
15639353973
15639365813
15639373893
15516297836
15565828575
15670108017
15637342161
15670158810
15517335724
13253044488
15565826861
15639373103
15516433752
15516614779
15670403572
15670457004
15617141561
15565227457
13243495978
15517374682
15617142290
13072695246
15670411351
15603824810
15565794134
15670410608
15603824312
15670410648
15603824138
15670411710
15517372401
15517372442
15517361495
13017546044
15515956059
15639162194
使用 $ awk 'BEGIN{OFS="\t"; RS=ORS="\r\n"} {if(length($1)>0){print $1, $1}}' tmp/serial_number.data
得到的结果:
15617831910     15617831910
15617831790     15617831790
13043795558     13043795558
13137180868     13137180868
13203732017     13203732017
13203731261     13203731261
13203731057     13203731057
13203735739     13203735739
13203731607     13203731607
13203732336     13203732336
13203733887     13203733887
13140590497     13140590497
13233844955     13233844955
15517338450     15517338450
15565227246     15565227246
15517336724     15517336724
13140598206     13140598206
15516456326     15516456326
15560158504     15560158504
15560158934     15560158934
15565822773     15565822773
15639353973     15639353973
15639365813     15639365813
15639373893     15639373893
15516297836     15516297836
15565828575     15565828575
15670108017     15670108017
15637342161     15637342161
15670158810     15670158810
15517335724     15517335724
13253044488     13253044488
15565826861     15565826861
15639373103     15639373103
15516433752     15516433752
15516614779     15516614779
15670403572     15670403572
15670457004     15670457004
15617141561     15617141561
15565227457     15565227457
13243495978     13243495978
15517374682     15517374682
15617142290     15617142290
13072695246     13072695246
15670411351     15670411351
15603824810     15603824810
15565794134     15565794134
15670410608     15670410608
15603824312     15603824312
15670410648     15670410648
15603824138     15603824138
15670411710     15670411710
15517372401     15517372401
15517372442     15517372442
15517361495     15517361495
13017546044     13017546044
15515956059     15515956059
15639162194     15639162194
然后再使用awk,就可以对两个要比对的文件都是以tab(\t)作为字段分隔符的文件,进行比对了。
1.将含有一列的文件,使用awk处理为两列的文件,将内容写到临时文件中
$  awk 'BEGIN{OFS="\t"; RS=ORS="\r\n"} {if(length($1)>0){print $1, $1}}' tmp/serial_number.data > a.out
2.拿上步生成的临时文件a.out,进行比对。
$ awk -F"\t" 'NR==FNR {a[$2]} NR>FNR {if(!($1 in a)){print $1}}' tmp/all_tf_f_user.data a.out
比对结果如下:
15617831910
15617831790
13203732017
13203731261
13203731057
13203735739
13203731607
13203732336
13203733887
15639162194
10-10 00:49