【问题标题】:Print a column in one file while processing the other file using awk在使用 awk 处理另一个文件时打印一个文件中的一列
【发布时间】:2016-10-15 02:49:28
【问题描述】:

所以我试图理解这个answer 使用awk 合并两个文件,我想出了我的解决方案来满足我的需求。

awk 'FNR==NR{a[$1]=$2 FS $3;next} {a[$1]=$2 FS $3}{ print a[$1]}' file2 file1

我的文件如下:-

file1file2内容如下:-

1 xyz pqr F -
1 abc def A -
1 abc mno G -


1 abc def A
1 xyz pqr T

我期待如下输出:-

1 xyz pqr F - T
1 abc def A - A

基本上匹配file1file2 的第1、2、3 列,并将file2 上最后一列的内容打印附加到结果上。

所以我对解决方案的理解如下,

  1. FNR==NR{a[$1]=$2 FS $3;next} 将在 file2 上处理,将数组 a 的条目存储为 column2 空间 column3 直到 file2 结束。
  2. 现在在file1 上,我可以通过执行{a[$1]=$2 FS $3} 来匹配file2 中的那些行,这将为我提供file1 中的所有行,其列$1 的值a[$1] 与column2 值相同$2 空间列 3 值 $3。现在问题来了。
  3. 在 file1 中匹配它们后,我不知道如何按预期打印这些值。我尝试打印$0a[$1],他们给了我

按顺序输出,

1 xyz pqr F -
1 abc def A -

xyz pqr
abc def

分别。我最大的担心是因为在FNR==NR 传递期间我没有从file2 捕获最后一列,我可能没有将值存储在我的数组中?还是我把它储存起来了?

【问题讨论】:

  • 最好不要说awk 'FNR==NR{a[$1 FS $2 FS $3]=$4;next} (($1 FS $2 FS $3) in a) {print $0, a[$1 FS $2 FS $3]}' f2 f1
  • @fedorqui:错过了a[...]=$4 的逻辑,这对我有帮助!请将其作为答案提供,以供参考!

标签: bash shell awk


【解决方案1】:

使用这个awk

awk 'NR==FNR{a[$2 FS $3]=$4; next} $2 FS $3 in a{print $0, a[$2 FS $3]}' file2 file1

你的awk有一些问题。

  • 您主要关心的是来自file2$4。但是,您还没有存储它。
  • 访问file1 时,您正在重新分配一个数组a,其值为file1。 (这个:a[$1]=$2 FS $3

正如@EdMorton 所建议的,一种更易读的形式:

awk '{k=$2 FS $3} NR==FNR{a[k]=$4; next} k in a{print $0, a[k]}' file2 file1

【讨论】:

  • 这是一个很好的答案!我当然会接受,只是等待比我更有效的逻辑
  • @EdMorton:请将其作为答案发布以供将来参考!
猜你喜欢
  • 2023-03-10
  • 2013-04-07
  • 2023-03-07
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2015-01-24
  • 2022-10-01
相关资源
最近更新 更多