Маршрут через временные файлы:
$ awk 'BEGIN { n = 1 } /^start newset/ { n++; next } { name = sprintf("tmp-%04d", n); print >name }' file
Это не приведет к выводу в терминал, но создаст файлы с именем tmp-n
, где n
— это заполненное нулем -четырехзначное -целое число, большее или равное 1. Будет один файл для каждый набор данных.
Затем мы можем склеить эти временные файлы вместе:
$ paste tmp-*
1 1.1 1 2.2 1 18.2
2 4.0 2 6.1 2 4.3
3 3.2 3 10.3
4 2.1
или с пробелами в качестве разделителей вместо табуляции:
$ paste -d ' ' tmp-*
1 1.1 1 2.2 1 18.2
2 4.0 2 6.1 2 4.3
3 3.2 3 10.3
4 2.1
Если в данных имеется большое количество наборов, с этим:
возникают две проблемы.У вас могут закончиться файловые дескрипторы в awk
. От этого можно защититься, изменив второй кодовый блок awk
с
{ name = sprintf("tmp-%04d", n); print >name }
-
{ name = sprintf("tmp-%06d", n); print >>name; close(name) }
(обратите внимание на изменение строки форматирования, чтобы можно было использовать большие числа)
Могут возникнуть проблемы с выполнением команды paste
, так как шаблон tmp-*
расширяется до слишком большого количества файлов. Дайте мне знать, если это проблема, и я разберусь с ней, тогда (будет цикл оболочки, который создает результат путем добавления столбцов из tmp-*
файлов ).