データファイルは次のようになります:
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'