Intereting Posts
Есть ли способ выполнять команды при вводе пользователя? Как остановить github, всегда спрашивая имя пользователя / пароль? Нарушение поведения при проверке «3D-ускорения» Как перенаправить вывод sqlite3 в файл Что такое «правильный путь» для внесения изменений в /etc/resolv.conf с помощью /etc/resolv.conf.d? Сколько места занимает инодекс? Являются ли FIFO, pipe & Unix доменными сокетами одинаковыми в ядре Linux? Проблема раскладки клавиатуры при загрузке с LUKS Можно ли запустить фоновый процесс с определенным рабочим каталогом? Не удалось загрузить в F17 Странное поведение rsync rsyslog – дублирование журнала с использованием 2 серверов Как отобразить приветственное сообщение в unix? Поиск специальных файлов по второстепенному номеру и большому числу Простой способ найти файлы, применить изменения и записать в другой каталог под разными именами?

Как начать новую строку каждый n-й столбец?

Таким образом, у меня есть текстовый файл с 20 000 «столбцами» длиной и двумя строками. Данные выглядят примерно так:

FP1 amp FP1 lat FP2 amp FP2 lat FP3 amp FP3 lat AF1 amp AF1 lat 4.1 231 2.2 232 1.3 233 4.4 234 

Каждые 120 столбцов или около того значения заголовка повторяются с разными значениями во второй строке. Как я могу отделить эти «столбцы» каждые 120 столбцов, начать новую строку и продолжать делать это до конца файла?

Предположим, что мы переносим данные с BSD rs :

 $ rs -T abcdefgh 1 2 3 4 5 6 7 8 [Ctrl-D][Enter] a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 

Теперь мы имеем это как два длинных столбца, восприимчивых к обработке awk . Мы можем прокручивать данные и накапливать пару строк от $1 и $2 . Всякий раз, когда NR по модулю нужного размера строки равен нулю, мы выводим накопленные строки.

 $ awk '{ hdrs = (hdrs ? hdrs OFS $1 : $1); vals = (vals ? vals OFS $2 : $2); } !(NR % 3) { print hdrs; print vals; hdrs = vals = "" } END { print hdrs; print vals; }' a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 [Ctrl-D][Enter] abc 1 2 3 def 4 5 6 gh 7 8 

Если требуется другая форма вывода, такая как следующие (индивидуально обернутые заголовки и значения в конгруэнтном шаблоне), нетрудно массировать это из кода Awk:

 abc def gh 1 2 3 4 5 6 7 8 

Хорошо, теперь фактические данные беспорядочны, потому что в нем есть заголовки полей, разделенные пробелами, и они содержат пробелы.

Предполагая, что поля содержат только отдельные внутренние пространства и всегда разделены с помощью нескольких пространств, мы можем сделать предварительную обработку данных, чтобы заменить внутренние пространства символом без пробелов (который еще не встречается в данных), например как тильда ( ~ ). Например, используя Sed:

 $ sed -e 's/\([^ ]\) \([^ ]\)/\1~\2/g' foo bar xyzzy quux alpha beta gamma delta [Ctrl-D][Enter] foo~bar xyzzy~quux alpha~beta gamma delta 

Фильтрация назад с

 tr '~' ' '