Требуется GNU datamash версии 1.1.1. В версии 1.0.7 работает некорректно.
#!/bin/bash
tr '\n' ' ' < input.txt |
sed 's/\s*NA\s*/\n/g;' |
sed '/^$/d' |
datamash --no-strict --filler="." -W -t' ' transpose
Пояснение
tr '\n' ' ' < input.txt
-заменяет все символы новой строки на пробелы. Другими словами, соедините все строки в одну строку. sed 's/\s*NA\s*/\n/g;'
-заменяет все 'NA' и смежные пробелы на новую строку. То есть разбивает большую строку на несколько отдельных строк, каждая из которых является будущим столбцом, написанным горизонтально. sed '/^$/d'
-удаляет все пустые строки. datamash --no-strict --filler="." -W -t' ' transpose
--no-strict
-разрешить строки с различным количеством полей --filler="."
-заполнить пропущенные значения точкой. Его можно заменить на космос. -W
-используйте пробел (один или несколько пробелов и/или табуляции )для разделителей полей ввода. -t' '
-используйте пробел вместо TAB в качестве разделителя выходных полей. transpose
-преобразует строки в столбцы. Вход
NA
4
3
5
7
8
3
NA
NA
NA
3
4
5
2
NA
2
7
4
6
9
NA
Выход
4 3 2
3 4 7
5 5 4
7 2 6
8. 9
3..
Теперь да:https://gitlab.com/ole.tange/tangetools/-/tree/master/teetime
Usage:
... | teetime [-a] file |...
teetime -i file
-a append to file
-i read from file
Мне не удалось заставить работать teetime (ошибок нет, возможно, у меня был неправильный perl ), поэтому я написал такой, который можно установить с помощью pip.
pip3 install --user pipevcr
Вы записываете трубу с помощью -r
, например.:
(echo start; sleep 1; echo continue; sleep 1; echo end) | pipevcr -r test.vcr
И воспроизведите его с помощью:
pipevcr test.vcr
Если вы хотите ускорить его, вы можете установить максимальное время ожидания для пауз:
pipevcr -m 300 test.vcr
Зависит от требуемой точности. С точностью до одной -секунд сценарий оболочки может просто ставить перед каждой строкой текущее значение SECONDS. При воспроизведении он может заснуть на период между собственными СЕКУНДами и значением в следующей строке файла.
Более высокая точность потребует вызова date
(, который дает наносекунды с неизвестной точностью и включает внешний процесс для каждой строки данных )или использования C (, который дает микросекунды ). Задержки во входном канале могут немного нарушить первоначальную -штамповку времени.