Bash 基于一列匹配和打印两个文件时的awk

Bash 基于一列匹配和打印两个文件时的awk,bash,awk,Bash,Awk,我有两个文件(分隔符是tab) 文件1:db.txt string1 string2 string3 001 string4 string5 string6 string7 002 string8 string9 string10 string11 003 string12 id1 001 id2 003 string1 <TAB> string2 <TAB> 9999 abc dehi [way:pn9999] <TAB> 001 <TAB>

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

文件1:
db.txt

string1 string2 string3 001 string4
string5 string6 string7 002 string8
string9 string10 string11 003 string12
id1 001
id2 003
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
文件2:
query.txt

string1 string2 string3 001 string4
string5 string6 string7 002 string8
string9 string10 string11 003 string12
id1 001
id2 003
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
我想匹配file1和file2,并打印(如果有匹配)db.txt的第1列到第5列和query.txt的第1列

string1 string2 string3 001 string4
string5 string6 string7 002 string8
string9 string10 string11 003 string12
id1 001
id2 003
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
我尝试使用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 string2 string3 001 string4
string5 string6 string7 002 string8
string9 string10 string11 003 string12
id1 001
id2 003
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
string1 string2 9999 abc dehi[way:pn9999]001组织;第3条第4条
第5列第6列9999 dwd meti[通道:pn8999]002 org2;string7
第8列第9列9999 dwd meti[通道:pn7999]003 org4;弦10

您可以像这样使用
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

根据f1中记录的数量,如果总是有5个字段要检查,则循环
for
字段可能更有效。当然,我们无法猜测记录的数量。
db.txt
query.txt
相比是巨大的,这对我发布的示例非常有效,但不知何故它对我的文件不起作用;我在列中有一些空格。默认情况下,空格是字段分隔符。谢谢你的耐心,我为你添加了一个更好的例子,用
db.txt
ok try tab作为分隔符:
awk'BEGIN{FS=OFS=“\t”}FNR==NR{a[$2]=1;next}$4在a{print$0,a[$4]}query.txt db.txt
非常感谢你,成功了!实际上,我以前尝试过
FS=OFS
选项,但不知何故失败了是因为该键始终位于
db
文件的第四个字段中?有时是不同的键,但下面的问题是:我有两个稍微不同的文件的问题。我想根据第一列匹配2个文件,当存在匹配时,它应该打印file1和file2的第2列。这就是我的代码:
awk'BEGIN{FS=OFS=“\t”}FNR==NR{a[$1]=$1;next}$1在{print a[$2],$2}'中作为一个新问题发布,你会得到更多的报道。