gpt4 book ai didi

bash - 比较不同文件中的两列并为共享项追加数据 - UNIX

转载 作者:行者123 更新时间:2023-11-29 09:26:07 25 4
gpt4 key购买 nike

我一直在论坛中搜索我的问题的解决方案,但不幸的是我没有成功。我对 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

我想根据第二列比较file1file2。如果对象相同,我想将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com