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

时间:2018-08-28 10:17:00

标签: linux bash csv

假设我有:

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

另一种方法可以进行修正,如@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