awk存储和重置文件中的变量

时间:2017-01-18 13:45:03

标签: awk

尝试使用awk在同一行file1中查找file2中的字符串(总是只有1个字段)。也就是说,如果在file1中使用了第1行,则file2中仅使用第1行。由于可能缺少值,因此需要进行检查以确保其存在。这只是一个想法,所以可能有更好的方法,但我只是想看。谢谢你:)。

文件1

R_2017_01_13_12_11_56_user_S5-00580-24-Medexome
R_2017_01_13_14_46_04_user_S5-00580-25-Medexome

file2的

The oldest folder is R_2017_01_13_12_11_56_user_S5-00580-24-Medexome, created on 2017-01-17+11:31:02.5035483130 and analysis done using v1.4 by cmccabe at 01/17/17 12:41:03 PM

$filename

的所需输出
R_2017_01_13_12_11_56_user_S5-00580-24-Medexome

使用$filename运行一系列进程后,我需要使用新的变量重置该变量。

file1 (重新运行某些进程后)

R_2017_01_13_12_11_56_user_S5-00580-24-Medexome
R_2017_01_13_14_46_04_user_S5-00580-25-Medexome

file2 (重新运行某些过程后)

The oldest folder is R_2017_01_13_12_11_56_user_S5-00580-24-Medexome, created on 2017-01-17+11:31:02.5035483130 and analysis done using v1.4 by cmccabe at 01/17/17 12:41:03 PM
The oldest folder is R_2017_01_13_14_46_04_user_S5-00580-25-Medexome, created on 2017-01-17+06:53:07.3194950000 and analysis done using v1.4 by cmccabe at 01/18/17 06:59:08 AM

$filename的所需输出现在是(因为这是值是新的)

R_2017_01_13_14_46_04_user_S5-00580-25-Medexome

AWK

filename=$(awk 'NR==1{print $1}' file1 file2)

2 个答案:

答案 0 :(得分:2)

您想要检查file2的最后一行是否包含file1中给出的字符串。

为此,您只需阅读最后一行,然后查看它是否与file1中的任何单词匹配。

$ awk 'ENDFILE {line=$0} FNR<NR && line ~ $1' file2 file1
R_2017_01_13_14_46_04_user_S5-00580-25-Medexome

这使用:

  • ENDFILE {line=$0}
    在阅读文件后,$0包含已读取的最后一行(嗯,not always,但我认为您有awk的现代版本,因为ENDFILE是GNU awk扩展)。有了这个,我们将最后一行存储到line,以便我们在阅读下一个文件时可以使用它。

  • FNR<NR && line ~ $1
    在读取file1时,检查存储行中是否存在给定的单词。如果是,则会自动触发print 这使用FNR<NR技巧,其中FNR保存当前文件中的行号,而NR一般为行数。这样,FNR==NR仅在阅读第一个文件时才为真,而FNR<NR从第二个文件开始。

答案 1 :(得分:1)

如果您只需要连续查看file2 的最后一行,您可以:

$ awk 'NR==FNR{a[$1];next}{for(i in a)if(i ~ $0) print i}' file1 <(tail -f file2)

说明:

  • NR==FNR{a[$1];next}a
  • 中读取file1数组中的搜索字词
  • file2使用流程替换tail -f进入awk,即。它从file2的末尾读取记录,通过a中的所有搜索词然后从记录中查找它们,如果匹配则打印搜索词