ファイルがあります:
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つの部分に分かれています。
BEGIN
- スクリプトは、入力を読み取る前に、入力フィールドと出力フィールドの区切り文字をタブに設定します。NR==1
- 示されているようにタイトルが書き換えられます。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