我一直在论坛中搜索我的问题的解决方案,但不幸的是我没有成功。我对 bash 还很陌生;因此,我将非常感谢链接到先前问题/讨论的任何建议
我有两个文件:
文件 1
Ada ada
Ada ada
Ada aidB
Ada alkA
Ada alkB
Ada alkB
AdiY adiA
AdiY gadA
文件2
NP_414557.1 insL1
NP_414559.1 mokC
YP_025292.1 hokC
NP_414560.1 nhaA
NP_414561.1 nhaR
NP_414562.1 insB1
NP_414563.1 insA
NP_414564.1 rpsT
我想根据第二列比较file1 和file2。如果对象相同,我想将 file2 中第 1 列中的文本附加到 file1 中第三列中相对于该特定共享条目的文本。
预期输出: file1
PhoB caiT NP_414580.1
PhoP caiE NP_414581.1
PhoP caiB NP_414582.1
请将报告的文本视为示例。
我正在努力使用 awk 尝试调整先前问题的代码:
Compare two files of different columns and print different columns
awk 'NR==FNR{a[$1]=$2 ; next }$2 in a {$1=$1 FS a[$2]print}' file1 file2
非常感谢您的宝贵时间和帮助。
最好的。
最佳答案
正如@fedorqui 评论的那样,您的示例输入/输出不一致。我认为这应该可以解决问题:
awk 'NR==FNR{a[$2]=$0; next} a[$2]>0{print a[$2],$1}' file1 file2
文件1:
A alice
B bob
C carol
D dan
文件2:
1 dan
2 alice
3 carol
4 bob
输出:
$ awk 'NR==FNR{a[$2]=$0} NR>FNR && a[$2]>0{print a[$2],$1}' file1 file2
D dan 1
A alice 2
C carol 3
B bob 4
输出可以按您使用 sort -k
选择的任何列进行排序。分解 awk
代码:
NR==FNR{a[$2]=$0; next
-NR
是一个awk
变量,它包含到目前为止处理的总行数。FNR
类似,但只包含当前文件的进程行数,所以这个条件实际上意味着“只对第一个输入文件执行此操作”。关联的操作将整行 ($0
) 存储在关联数组a
中,索引是该行第二个字段的值。next
只是意味着awk
应该移动到下一行而不做进一步的处理。a[$2]>0{print a[$2],$1}
- 此条件只会针对第二个和后续输入文件进行测试。第二个字段用作从a
中查找值的索引 - 如果该值大于 0(即,在这种情况下该值是一个字符串),则打印该值,然后通过当前行的第一个字段。
基本上,第一个文件的每一行都存储在一个数组中,由该行的第二个字段索引。如果第二个字段在第二个文件中匹配,则打印第一个文件的整行,并附加第二个文件的第二个字段。
关于bash - 比较不同文件中的两列并为共享项追加数据 - UNIX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23515847/