假设我有:
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中执行此操作的好方法是什么?
答案 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