awk / sed / 等在一个文件中连接列

awk / sed / 等在一个文件中连接列

我想知道有什么更简单的方法可以做到这一点:

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

假设生成几行表格分隔的值:

% perl -E 'say join "\t", 1..8 for 1..3'

然后可以根据需要通过适当的方法处理各个列旗帜变量功能在 Perl 中可用。

% perl -E 'say join "\t", 1..8 for 1..3' \
| perl -pale '$_=join "\t", @F[0..3], join "", @F[4..7] if $. > 1' 
1   2   3   4   5   6   7   8
1   2   3   4   5678
1   2   3   4   5678
% 

答案3

是的,有很多方法。我已经在创建的文件上测试了以下两个:

perl -le 'next if $.==1; for(1..20){print join "\t",1..20 }' > file

该文件有 20 行和 20 个制表符分隔的列。

  1. 珀尔

    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 
    
  2. 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'

相关内容