У меня есть файл данных, который выглядит так:
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
Самый простой подход — это метод позднего слияния или зиппера. Предположим, что последний символ каждой строки — пробел. Сначала разделите файл на две части относительно столбцов, которые вы хотите вырезать.
cut -d' ' -f1-4 file > file1
cut -d' ' -f5- file > file2
Во-вторых, объедините файлы с помощью позднего слияния и удалите пустые строки.
paste -d'\n' file1 file2 | sed '/^$/d'