Объединение определенных строк в файле - PullRequest
0 голосов
/ 13 декабря 2018

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

Current assets:
Cash and cash equivalents
                                  $ 21,514       $ 21,120
Short-term marketable securities
                                    33,769         20,481
Accounts receivable
                                    12,229         16,849
Inventories
                                     2,281          2,349

, и я пытаюсь сделать следующее (с помощью sed):: если текущая строка начинается с заглавной буквы, а следующая строка начинается с пробела, скопируйте последние N символов из следующей строки в последние N столбцов текущей строки, а затем удалите следующую строку.Я делаю это так, потому что в файлах есть другие строки, начинающиеся с пробела, которые я хочу игнорировать.Результаты должны выглядеть следующим образом:

Current assets:
Cash and cash equivalents         $ 21,514       $ 21,120
Short-term marketable securities    33,769         20,481
Accounts receivable                 12,229         16,849
Inventories                          2,281          2,349

Самое близкое к тому, что я получил, это то, что я хочу:

sed -i -r ':a;N;$!ba;s/[^A-Z]*\n([[:space:]])/\1/g' file.txt

, и я считаю, что шаблон соответствует, но последующая замена действительно портит выравнивание столбцов чисел.Когда я только начинал, это казалось простой операцией, но часы поиска и экспериментов не помогли.Я открыт для любых решений, которые используют что-то другое, кроме sed, но предпочли бы, чтобы это было строго bash.Большое спасибо!

1 Ответ

0 голосов
/ 14 декабря 2018

Это может работать для вас (GNU sed):

sed -r '/^[[:upper:]]/{N;/\n\s/{h;x;s/\n.*//;s/./ /g;x;G;s/(\n *)(.*)\1$/\2/};P;D}' file

Это решение обрабатывает только две последовательные строки, которые начинаются с заглавной буквы и пробела соответственно.Все остальные строки печатаются как есть.

Собрав две вышеупомянутые строки в пространство образца (PS), копия создается и сохраняется в пространстве удержания (HS).Обработка теперь свопы к ГС.Вторая строка удаляется, а содержимое первой превращается в пробелы.Обработка теперь переходит обратно на PS.HS добавляется к PS, и с использованием сопоставления и обратных ссылок длина первой строки в пробелах вычитается из объединенных строк.

Строки выводятся на печать, а затем удаляются.Если вторая строка не начинается с пробела, с помощью команд P и D, она не удаляется, а переоценивается с помощью регулярного выражения в начале сценария sed.

...