1つのファイルの列を連結するawk/sed/etc

1つのファイルの列を連結するawk/sed/etc

これを行うより簡単な方法があるかどうか疑問に思います。

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

はい、いくつかの方法があります。生成されたファイルで次の2つをテストしました。

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

関連情報