代码之家  ›  专栏  ›  技术社区  ›  Forivin

将tab分隔值文件的x列与第二个tsv文件的x列交换

  •  0
  • Forivin  · 技术社区  · 6 年前

    假设我有:

    文件1.tsv

    Foo\tBar\tabc\t123
    Bla\tWord\tabc\tqwer
    Blub\tqwe\tasd\tqqq
    

    文件2.tsv

    123\tzxcv\tAAA\tqaa
    asd\t999\tBBB\tdef
    qwe\t111\tCCC\tabc
    

    我想用file2.tsv的第3列覆盖file1.tsv的第3列,最后得到:

    Foo\tBar\tAAA\t123
    Bla\tWord\tBBB\tqwer
    Blub\tqwe\tCCC\tqqq
    

    在bash中有什么好的方法可以做到这一点?

    2 回复  |  直到 6 年前
        1
  •  2
  •   PesaThe    6 年前

    看看这个 awk 以下内容:

    awk 'FNR==NR{a[NR]=$3;next}{$3=a[FNR]}1' OFS='\t' file{2,1}.tsv > output.tsv
    

    如果你想用 bash ,只需稍加努力:

    while IFS=$'\t' read -r a1 a2 _ a4; do
        IFS=$'\t' read -ru3 _ _ b3 _
        printf '%s\t%s\t%s\t%s\n' "$a1" "$a2" "$b3" "$a4"
    done <file1.tsv 3<file2.tsv >output.tsv
    

    输出:

    Foo     Bar     AAA     123
    Bla     Word    BBB     qwer
    Blub    qwe     CCC     qqq
    
        2
  •  0
  •   Inder Manali    6 年前

    另一种方法可以是,通过@pesathe指出的修正:

    paste -d$'\t' <(cut -d$'\t' -f1,2 file1.tsv) <(cut -d$'\t' -f3 file2.tsv) <(cut -d$'\t' -f4 file1.tsv)
    

    输出为:

    Foo     Bar     AAA     123
    Bla     Word    BBB     qwer
    Blub    qwe     CCC     qqq