Один из моих любимых приемов (и я делал это слишком долго) - использовать xargs -L для объединения нескольких строк в одну.
Я начну с окончательного ответа и покажу, как я туда попал:
tail -r log.txt | xargs -L3 | tail -r | awk '{ print $1 , $2, "," $3 }'
Хорошо, давайте начнем с xargs -L3:
xargs -L3 <log.txt
Выше приведено что-то близкое к тому, что вы хотите:
$ xargs -L3 <log.txt
46.91 01:46:40 12/28/18
41.84 01:48:04 12/28/18
43.65 01:49:25 12/28/18
Очевидно, порядок столбцов неправильный.Итак, давайте сначала перевернем файл:
$ tail -r < log.txt
12/28/18
01:49:25
43.65
12/28/18
01:48:04
41.84
12/28/18
01:46:40
46.91
Теперь файл перевернут, давайте снова направим его через xargs:
$ tail -r < log.txt | xargs -L3
12/28/18 01:49:25 43.65
12/28/18 01:48:04 41.84
12/28/18 01:46:40 46.91
Как вы можете видеть выше, столбцы в правильном порядке, но линии поменялись местами.Давайте просто снова воспользуемся командой tail -r для обращения к файлу:
$ tail -r < log.txt | xargs -L3 | tail -r
12/28/18 01:46:40 46.91
12/28/18 01:48:04 41.84
12/28/18 01:49:25 43.65
Теперь результат в правильном порядке, но мы пропустили запятую (,).Мы можем вставить это с помощью awk или sed.Мне нравится awk:
$ tail -r < log.txt | xargs -L3 | tail -r | awk '{ print $1 , $2, "," $3 }'
12/28/18 01:46:40 ,46.91
12/28/18 01:48:04 ,41.84
12/28/18 01:49:25 ,43.65
Но если вы поклонник sed, вы можете попробовать это следующим образом:
$ tail -r < log.txt | xargs -L3 | tail -r | sed 's/:.. /&,/'
12/28/18 01:46:40 ,46.91
12/28/18 01:48:04 ,41.84
12/28/18 01:49:25 ,43.65
Приведенная выше команда достаточно проста, но она будет работать, только если выесть вход, который заканчивается.То есть tail -r не работает, если входной поток непрерывен, потому что ему нужно прочитать EOF, прежде чем он сможет изменить вход.Итак, эта команда, которую я вам дал, действительно полезна только в том случае, если вы выйдете из цикла и запустите процесс обработки файла log.txt.