使用awk比较文件中两行的对应值

时间:2016-09-17 17:06:26

标签: awk

name1   20160801|76 20160802|67 20160803|49 20160804|35 20160805|55 20160806|76 20160807|77 20160808|70 2016089|50  20160810|75 20160811|97 20160812|90 20160813|87 20160814|99 20160815|113    20160816|83 20160817|57 20160818|158    20160819|61 20160820|46 20160821|1769608    20160822|2580938    20160823|436093 20160824|75 20160825|57 20160826|70 20160827|97 20160828|101    20160829|96 20160830|95 20160831|89 
name2   20160801|32413  20160802|37707  20160803|32230  20160804|31711  20160805|32366  20160806|35532  20160807|36961  20160808|45423  2016089|65230   20160810|111078 20160811|74357  20160812|71196  20160813|71748  20160814|77001  20160815|91687  20160816|92076  20160817|89706  20160818|126690 20160819|168587 20160820|207128 20160821|221440 20160822|234594 20160823|200963 20160824|165231 20160825|139600 20160826|145483 20160827|209013 20160828|228550 20160829|223712 20160830|217959 20160831|169106 

我在一个文件中有两行的行位,比如line1和line2。这些行可能在文件中的任何位置,但我可以使用基于每行中的名称(第一个单词)的搜索关键字来访问行位置

20160801表示yyyymmdd,其关联值由|分隔 我需要比较给定两行的每个日期相关的值。

我是awk的新手。我不明白如何同时比较这两行。

1 个答案:

答案 0 :(得分:0)

你的问题根本不清楚。也许第一步是明确表达1)我想解决的问题是什么; 2)我有什么工具或数据可以解决它?

我可以提供的问题的唯一提示(因为您的问题陈述没有明确阐述)是:

  1. 在awk中,您可以使用仅在第一个文件中为true的测试FNR==NR来比较两个不同的文件。

  2. 您可以使用/^name1/形式的正则表达式找到关键字,这意味着以该模式开头的行

  3. 你可以通过将字段分隔符设置为该分隔符来拆分awk中的分隔符 - 在这种情况下(我认为)它听起来像是|但你也在比较空格分隔的字段在那些领域内?

  4. 您可以通过保存第一行的数据并与另一个文件中第二行的数据进行比较,一旦您能清楚地表达“比较”对您的意义。

  5. 将其包装起来,给出:

    $ cat /tmp/f1.txt
    name1   20160801|76 20160802|67 20160803|49 20160804|35 20160805|55 20160806|76 20160807|77 20160808|70 2016089|50  20160810|75 20160811|97 20160812|90 20160813|87 20160814|99 20160815|113    20160816|83 20160817|57 20160818|158    20160819|61 20160820|46 20160821|1769608    20160822|2580938    20160823|436093 20160824|75 20160825|57 20160826|70 20160827|97 20160828|101    20160829|96 20160830|95 20160831|89 
    $ cat /tmp/f2.txt
    name2   20160801|32413  20160802|37707  20160803|32230  20160804|31711  20160805|32366  20160806|35532  20160807|36961  20160808|45423  2016089|65230   20160810|111078 20160811|74357  20160812|71196  20160813|71748  20160814|77001  20160815|91687  20160816|92076  20160817|89706  20160818|126690 20160819|168587 20160820|207128 20160821|221440 20160822|234594 20160823|200963 20160824|165231 20160825|139600 20160826|145483 20160827|209013 20160828|228550 20160829|223712 20160830|217959 20160831|169106
    

    你可以找到有问题的行:

    $ awk -F"|" '/^name/ && FNR==NR {print $1}' f1.txt f2.txt
    name1   20160801
    $ awk -F"|" '/^name/ && FNR<NR {print $1}' f1.txt f2.txt
    name2   20160801
    

    (为了清晰起见,我只打印了第一个字段)

    然后用它来比较。将第一个保存在关联数组中,然后在找到时比较第二个。