先说说的工作环境吧,比如,比如我要查找一批手机号。把异常的数据找出来。当然前提是经过我程序的处理,已经有了含有异常的手机号码文件和正常手机号的数据文件。我们很容易想到,将两个文件做减法操作。即可得到异常数据部分。经过自己的摸索,发现还是数据存放格式导致的。
因为含有异常数据的数据文件,只有一列。而正常手机号的数据文件,有多列,列与列直接的间隔符是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