在linux中使用Awk比较两个文件

时间:2015-02-13 13:20:31

标签: linux unix awk

我有两个文件,文件A和文件B.文件A的结构如下所示:

3314530275|76|1|20240422045006|
3335984469|64|2|20150804235959|
3367892381|203|3|20141025235959|
3369039388|203|4|20131219235959|

第二个文件B的内容如下:

3314530275|2000|999000000073101614|0|20370101000000|76|
3314530275|2000|999000000073101614|0|20370101000000|76|
3369039388|2000|812000002628721|-112|20360101235959|203|
3335984469|5037|5210367877660|180|20150213000000|64|
3335984469|5048|5210367877661|6|20150213000000|64|
3335984469|2000|812000002629182|1913|20360101235959|64|
3367892381|5014|5210365185964|419430400|20150308000000|203|
3367892381|5044|5210365185965|226020|20150308000000|203|
3367892381|2000|817000102009605|0|20360101235959|203|

脚本首先检查文件A,如果第三个字段($ 3)等于2,它应该存储第一个($ 1)和第四个列($ 4)的值。

然后它将检查我们在第一步中存储的值中是否存在$ 1值(第二个文件)。

  1. 如果该值存在且第二个字段等于2000,则应打印$ 1,$ 2,$ 4,(我们从第一个文件中获取并存储的第四列的值)

    < / LI>
  2. 如果该值存在且第二个字段不等于2000,则应打印$ 1,$ 2,$ 4,$ 5

  3. 上述案例中的示例输出:

    3335984469|5037|180|20150213000000|
    3335984469|5048|6|20150213000000|
    3335984469|2000|1913|20150804235959|
    

    这是我到目前为止所做的:

    awk -F \| 'FNR==NR {if($3 == 2) a[$1] = $4; next} ($1 in a) {if($2==2000) print$1"|"$2"|"$4"|"a[$1]"|"} ($1 in a) {if($2!=2000) print$1"|"$2"|"$4"|"$5"|"} ' FileA FileB > Output_File
    

    非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您的脚本将按原样运行,文件A的正确内容(FileA中的335984469应为3335984469,即另一个3。)但它可以简化为:< / p>

$ cat tst.awk
BEGIN{ FS=OFS="|" }
FNR==NR { if ($3==2) a[$1] = $4; next }
$1 in a { print $1, $2, $4, ($2==200 ? a[$1] : $5), "" }

$ awk -f tst.awk fileA fileB
3335984469|5037|180|20150213000000|
3335984469|5048|6|20150213000000|
3335984469|2000|1913|20360101235959|

如果您觉得有用,请随意将它们全部塞进一行。

如果上述方法不起作用,请检查两个输入文件中是否存在控制字符,最有可能的是每当他们的工具创建文件时由Microsoft慷慨捐赠的control_Ms。您可以使用cat -v检查它们,并使用dos2unix或类似内容将其删除。

答案 1 :(得分:0)

awk  'BEGIN{FS=OFS="|"};FNR==NR{if($3==2){a[$1]=$4;next}};{if( $1 in a && $2==2000 ){print $1,$2,$4,a[$1]}else if ($1 in a && $2!=2000){print $1,$2,$4,$5}}' 'fileA'  'fileB'

我对命令行进行的调整以获取上面的命令行

if( $1 in a && $2==2000 ){print $1,$2,$4,a[$1]}

else if ($1 in a && $2!=2000){print $1,$2,$4,$5}}

结果

3335984469|5037|180|20150213000000
3335984469|5048|6|20150213000000
3335984469|2000|1913|20150804235959
相关问题