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

标签 bash unix awk

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

相关文章:

unix - 在 Shell 脚本中验证变量

perl - 收集具有相似列的数据

xml - 除 xml 标签外的所有文本小写

linux - awk 正则表达式示例

bash - shell脚本中断时如何触发命令?

linux - 对应用程序的使用时间进行时间限制

c - Unix信号如何工作?

java - Bash 剥离引号 - 如何保留引号

bash - awk命令合并同一个文件的内容

bash - 如何使用通配符将一个目录的所有内容移动到新目录?