【问题标题】:Swap column x of tab-separated values file with column x of second tsv file将制表符分隔值文件的 x 列与第二个 tsv 文件的 x 列交换
【发布时间】:2023-03-06 02:27:01
【问题描述】:

假设我有:

file1.tsv

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

file2.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 中执行此操作的好方法是什么?

【问题讨论】:

标签: linux bash csv


【解决方案1】:

看看这个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】:

    另一种方法可以做到这一点,正如@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
    

    【讨论】:

    • 您的cut 命令拆分在字符t 上。尝试输入:1t23\tabc...。我相信 OP 在他的输入中有标签,而不是文字 \t,所以你可以改用 $'\t' :)
    • @Pesa 感谢您指出这一点,并进行了必要的编辑。 :)
    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多