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的新手。我不明白如何同时比较这两行。
答案 0 :(得分:0)
你的问题根本不清楚。也许第一步是明确表达1)我想解决的问题是什么; 2)我有什么工具或数据可以解决它?
我可以提供的问题的唯一提示(因为您的问题陈述没有明确阐述)是:
在awk中,您可以使用仅在第一个文件中为true的测试FNR==NR
来比较两个不同的文件。
您可以使用/^name1/
形式的正则表达式找到关键字,这意味着以该模式开头的行
你可以通过将字段分隔符设置为该分隔符来拆分awk中的分隔符 - 在这种情况下(我认为)它听起来像是|
但你也在比较空格分隔的字段在那些领域内?
您可以通过保存第一行的数据并与另一个文件中第二行的数据进行比较,一旦您能清楚地表达“比较”对您的意义。
将其包装起来,给出:
$ 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
(为了清晰起见,我只打印了第一个字段)
然后用它来比较。将第一个保存在关联数组中,然后在找到时比较第二个。