【问题标题】:awk when matching and printing two files based on one column基于一列匹配和打印两个文件时的 awk
【发布时间】:2017-08-19 22:30:41
【问题描述】:

我有两个文件(分隔符是制表符)

文件1:db.txt

string1 string2 string3 001 string4
string5 string6 string7 002 string8
string9 string10 string11 003 string12

文件2:query.txt

id1 001
id2 003

我想匹配 file1 和 file2 并打印(如果匹配)db.txt 的第 1 到 5 列和query.txt 的第 1 列

我尝试使用 awk,这里是我的代码:

awk 'BEGIN{FS=OFS="\t"}NR==FNR{a[$2]=$4;next}$4 in a{print $1,$2,$3,$4,$5,a[$1]}' query.txt db.txt

但我只得到一个包含匹配项的文件(?我至少是这样认为的)和 db.txt 文件的列

编辑:我更复杂的db2.txt

string1 <TAB> string2 <TAB> 9999 abc dehi [way:pn9999] <TAB> 001 <TAB> org; string3 string4
string5 <TAB> string6 <TAB> 9999 dwd meti [way:pn8999] <TAB> 002 <TAB> org2; string7
string8 <TAB> string9 <TAB> 9999 dwd meti [way:pn7999] <TAB> 003 <TAB> org4; string10

【问题讨论】:

  • 该键是否始终位于db 文件的第 4 个字段中?
  • 有时是不同的键,但是是的
  • 后续问题:我对两个略有不同的文件有疑问。我想根据第一列匹配 2 个文件,当有匹配时,它应该打印 file1 和 file2 的第 2 列。这就是我的代码:awk 'BEGIN{FS=OFS="\t"} FNR == NR { a[$1] = $1; next } $1 in a { print a[$2], $2 }'
  • 把它作为一个新问题发布,你会得到更多的报道。

标签: bash awk


【解决方案1】:
AMD$ cat f1
id1 001
id2 003

AMD$ cat f2
string1 string2 string3 001 string4
string5 string6 string7 002 string8
string9 string10 string11 003 string12

AMD $ awk 'NR==FNR {a[$2]=$1; next} {for(i in a) if(index($0,i)) print a[i], $0}' f1 f2
id1 string1 string2 string3 001 string4
id2 string9 string10 string11 003 string12

【讨论】:

  • 并且根据f1 中的记录数量与是否总是有5 个字段进行检查,for 循环字段可能更有效。我们当然无法猜测记录的数量。
  • db.txt 比 query.txt 大
【解决方案2】:

你可以像这样使用awk:

awk 'BEGIN{FS=OFS="\t"} FNR == NR { a[$2] = $1; next }
$4 in a { print $0, a[$4] }' query.txt db.txt

string1 string2 string3 001 string4 id1
string9 string10 string11 003 string12 id2

【讨论】:

  • 是的,这非常适合我发布的示例,但不知何故它不适用于我的文件;我在列中有一些空格
  • 空格默认为字段分隔符。您能否发布有问题的真实示例数据,以便我理解和修改我的答案。
  • 感谢您的耐心等待,我为db.txt添加了一个更好的示例
  • ok 尝试制表符作为分隔符:awk 'BEGIN{FS=OFS="\t"} FNR == NR { a[$2] = $1; next } $4 in a { print $0, a[$4] }' query.txt db.txt
  • 非常感谢您,完成了这项工作!我之前实际上尝试过FS=OFS 选项,但不知何故失败了
猜你喜欢
  • 1970-01-01
  • 2018-08-08
  • 2021-06-15
  • 1970-01-01
  • 2014-12-03
  • 2015-09-19
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
相关资源
最近更新 更多