我想知道有什么更简单的方法可以做到这一点:
awk 'NR > 1 {print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9$10$11$12$13$14$15$16}' file.in > file.out
简单来说就是“通过删除中间的制表符来连接第 9 列到第 16 列”
合并后的第 9-16 列成为“注释”,因此可能包含空格。
截至目前,已有 16 个专栏,但如果需要,可能会增加/减少。最终第 9 列(9-16 连接)成为“注释”字段。
干杯,
习
答案1
paste <(cut -f 1-8 file) <(cut -f9- file | tr -d '\t')
答案2
答案3
是的,有很多方法。我已经在创建的文件上测试了以下两个:
perl -le 'next if $.==1; for(1..20){print join "\t",1..20 }' > file
该文件有 20 行和 20 个制表符分隔的列。
珀尔
perl -F'\t' -ale '$"="\t";print "@F[0..7]",@F[8..$#F]' file
请注意,这将连接从第 10 个字段到末尾的所有字段。如果您只想连接 9 到 16,请使用以下命令:
perl -F'\t' -ale '$"="\t"; print "@F[0..7]", @F[8..15], "\t@F[16..$#F]"' file
awk
awk -F'\t' 'NR>1{ for(i=1;i<9;i++){ printf "%s\t",$i } for(i=9;i<=NF;i++){ printf "%s",$i }print "" }' file
和以前一样,这将连接 10 号之后的所有列。如果您只想连接 9 到 16,请使用以下命令:
awk -F'\t' 'NR>1{ for(i=1;i<9;i++){ printf "%s\t",$i } for(i=9;i<=16;i++){ printf "%s",$i } for(i=17;i<=NF;i++){ printf "\t%s", $i } print "" }' file
当然,awk
解决方案不是很短,但至少您不需要手动指定所有字段。
答案4
使用 GNU sed
(假设字段在输入中以制表符分隔):
sed 's/\t//9g'
删除每行倒数第 9 个制表符。
如果输入中的字段超过 16 个,并且您不需要多余的字段:
cut -f 1-16 | sed 's/\t//9g'