【问题标题】:paste two files according to concordance between columns根据列之间的一致性粘贴两个文件
【发布时间】:2016-11-18 17:39:56
【问题描述】:

我需要一些帮助:

我有文件 1:

ID
100
102
103
104
108
109
112
.
.
.

还有文件2:

ID    []    p1    p2
100    2.5    3.0    2.0
101    2.0    4.0    3.0
102    2.6    4.0    2.5
103    2.3    2.0    NA
104    2.3    2.0    2.0
105    3.5    2.8    2.0
106    1.7    NA    3.2
107    5.0    4.0    4.0
108    3.2    2.0    4.0
109    2.9    1.0    1.5
110    5.0    NA    NA
111    2.9    4.0    4.0
112    3.1    2.5    2.0
.
.
.

我想将两个文件粘贴到 file3 中,如下所示:

ID    []    p1    p2
100    2.5    3.0    2.0
102    2.6    4.0    2.5
103    2.3    2.0    NA
104    2.3    2.0    2.0
108    3.2    2.0    4.0
109    2.9    1.0    1.5
112    3.1    2.5    2.0
.
.
.

基本上,将字段 2、3、4 中的数据从 file2 粘贴到 file1,同时考虑 file1 和 file2 中字段 1 的一致性。

我尝试了一些带有 NR == NFR 的 awk 命令,但我只得到了 file1 内容后跟 file2 内容的输出...

有什么帮助吗?也欢迎带有剪切和粘贴功能的 Unix 命令

【问题讨论】:

    标签: shell join awk paste cut


    【解决方案1】:

    您确实可以为此使用awk

    awk 'NR==FNR{a[$1]=1} NR>FNR && a[$1]' file1 file2
    

    NR==FNR{a[$1]=1}a 数组填充了 file1 的内容。

    NR>FNR && a[$1] 正在打印 file2 的行,如果数组包含 ID(又名 $1)。

    【讨论】:

    【解决方案2】:

    如果你喜欢使用 join,你可以这样做:

    join file file2
    

    或者,如果输入是制表符分隔并且您使用 bash:

    join -t $'\t' file1 file2
    

    【讨论】:

    • 该操作尚未确认输入是制表符分隔的,因此您的第一个解决方案会像魅力一样工作。
    • 如发布的 file2 有多个空格,而不是制表符,但这有效:join -t $'\t' file1 <(tr -s ' ' '\t' < file2),或(无 bashisms)join file[12] | column -t
    • 我对连接方法的简单性感到相当惊讶。然后我意识到与问题的预期输出相比,它正在剥离空间。这让我假设原始文件可能在创建问题时丢失了标签,我添加了关于标签的备注,特别是因为我不能只使用\t。如果文件确实有多个空格,而不是一个空格或制表符,则基于简单连接的方法存在缺陷,它将多个空格连接成一个分隔符。
    【解决方案3】:

    更惯用的awk 解决方案是:

    awk 'NR==FNR{id[$1];next}$1 in id' file1 file2 >file3
    

    输出

    ID    []    p1    p2
    100    2.5    3.0    2.0
    102    2.6    4.0    2.5
    103    2.3    2.0    NA
    104    2.3    2.0    2.0
    108    3.2    2.0    4.0
    109    2.9    1.0    1.5
    112    3.1    2.5    2.0
    

    参考资料:

    1. awk [ referring to an array element ].
    2. awk [ next statement ].

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 2015-10-10
      • 2013-08-23
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多