【问题标题】:Using AWK to check column in file1 against file2使用 AWK 对照 file2 检查 file1 中的列
【发布时间】:2016-01-13 16:20:32
【问题描述】:

在比较一个文件的内容与另一个文件的内容时,我在使用 AWK 时遇到了一些困难。

文件 1.txt

142317216-|--|-tree-|-apple-|-|--
150232802-|--|-plant-|-sugar-|-granular|--
153947334-|--|-flower-|-daisy-|-single|--
153188646-|--|-soil-|-earth-|-|--

文件2.txt

apple,99817
sugar,75844
daisy,34566
earth,75544

使用 "-" 作为分隔符,我可以从 第 7 列中提取信息。

awk 'BEGIN { FS="-";}  {print $7;}' file1.txt 

输出

apple
sugar
daisy
earth

我的完整命令检查 file1,txt 中的 column7 是否存在于 file2.txt 中。

awk 'BEGIN {FS="-";} NR==FR{a[$1]=$7;next} {FS=",";} $1 in a ' file1.txt file2.txt 

获取第 7 列,然后将分隔符更改为“,”,并根据变量 a 检查 $1。

这没有显示任何结果,我正在努力理解语法以了解原因。谁能给我一些指示。

【问题讨论】:

  • 你想要NR==FNR 中的双等号(比较,而不是赋值)。提名关闭为简单的错字。
  • @tripleee 不仅仅是笔误,FS mid-script 设置错误,读取第二个文件第一行后生效,文件顺序错误.这个问题有明确的要求、示例输入和显示的尝试,因此恕我直言,它不应该被关闭,它需要添加的只是预期的输出。

标签: awk


【解决方案1】:

您没有显示您期望的输出,并且您没有在文件中包含不匹配(或重复)的值,所以这是一个猜测,但这可能是您想要的:

$ awk 'NR==FNR{file2[$1];next} {print ($7 in file2 ? "present:" : "absent:"), $7}' FS=',' file2 FS='-' file1
present: apple
present: sugar
present: daisy
present: earth

这种情况是可以在文件列表中设置变量的原因之一——在文件之间更改它们的值。

既然您刚刚开始学习 awk,请阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。

【讨论】:

  • 这是我第一次在 SO 上看到正确使用“在文件列表中设置变量”的答案。谢谢你。 :)
  • 是的,这是一个经常被滥用的功能:-)。这样做的唯一真正原因是 a) 更改文件之间的值(gawk BEGINFILE 不需要)和 b) 确保不解释反斜杠(因此 \t 保持 \t 并且不会成为文字制表符) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多