私のデータファイルは次のとおりです。
1
2 4 5 6 7 19
20
22
24 26 27
29 30 31 32 34 40 50 56 58
234 235 270 500
1234 1235 1236 1237
2300
4つ以上の列を持つ行を、それぞれ最大4つの列を含むより小さい行に分割したいと思います。したがって、出力は次のようになります。
1
2 4 5 6
7 19
20
22
24 26 27
29 30 31 32
34 40 50 56
58
234 235 270 500
1234 1235 1236 1237
2300
どんな提案がありますか?私の実際のデータファイルがかなり大きいことを考えてみましょう。
答え1
そしてawk
:
awk '{ if(NF>4) for(i=5; i<=NF; i+=4) $i = "\n" $i } 1' file
そしてsed
:
sed 's/ /\n/4;T;P;D' file
そしてperl
:
perl -lpe '$c = 0; s/ /++$c % 4 ? " " : "\n"/goe' file
出力:
1
2 4 5 6
7 19
20
22
24 26 27
29 30 31 32
34 40 50 56
58
234 235 270 500
1234 1235 1236 1237
2300
答え2
最も簡単な方法はポストマージまたはジッパー方法です。各行の最後の文字は空白であると仮定します。まず、切り取りたい列に基づいてファイルを2つの部分に分割します。
cut -d' ' -f1-4 file > file1
cut -d' ' -f5- file > file2
第二に、ポストマージを介してファイルを結合し、空白行を削除します。
paste -d'\n' file1 file2 | sed '/^$/d'