別の区切り文字を挿入しながらテキストファイルの最後の4つの列をマージする方法は?

別の区切り文字を挿入しながらテキストファイルの最後の4つの列をマージする方法は?

ファイルがあります:

sample_1   sample_2   sample_3   category   subcategory   class   levels
52         59         80         wild       animal        herbe   small
25         65         71         pet        insect

希望の出力を得るために、3番目の列以降のすべての列をマージしたいと思います。

sample_1   sample_2   sample_3   info         
52         59         80         wild|animal|herbe|small
25         65         71         pet|insect

答え1

次のawkスクリプトを考えてみましょう。

awk 'BEGIN { IFS=OFS="\t" }
     NR==1 { print "sample_1" OFS "sample_2" OFS "sample_3" OFS "info" }
     NR >1 { four=$4
             for(i=5; i <= NF; i++) four=four"|"$i
             print $1 OFS $2 OFS $3 OFS four }' input

スクリプトは3つの部分に分かれています。

  1. BEGIN- スクリプトは、入力を読み取る前に、入力フィールドと出力フィールドの区切り文字をタブに設定します。
  2. NR==1- 示されているようにタイトルが書き換えられます。
  3. NR >1- タブ(OFS)と組み合わせるために4つのフィールドを縮小します。フィールド#4で新しい値を初期化し、残りのフィールドを繰り返してその値にパイプ文字を追加します。ループが完了した後、再組み立てられたラインを印刷します。

答え2

行に末尾のスペースがない場合は、GNU sedを使用してすばやく実行できます。

$ sed -E -e 's/\s+/\|/4g' -e '1s/\S*$/info/' file
sample_1   sample_2   sample_3   info
52         59         80         wild|animal|herbe|small
25         65         71         pet|insect

大丈夫ならする後ろにスペースがあります。まず、スペースを削除できます。

sed -E -e 's/ +$//' -e 's/\s+/\|/4g' -e '1s/\S*$/info/' file

答え3

次のコマンドを試してください。素晴らしい作品。

awk 'NR >1{$4=$4$5$6$7;$5=$6=$6=$7="";print $0}' filename| sed '1i sample_1   sample_2   sample_3   info '| awk '{printf "%s%10s%10s%30s\n",$1,$2,$3,$4}'

出力

sample_1  sample_2  sample_3            info
52        59        80          wildanimalherbesmall
25        65        71                     petinsect

関連情報