Добавить, затем удалить строку в другую строку, только если она не содержит символа - PullRequest
0 голосов
/ 27 января 2019

В моем текстовом файле есть 6 строк в группе, разделенных двумя пустыми строками.Я напечатал номер строки для каждой строки в текстовом документе.

    365:--------------------------------------------------------------------------------
    366:--------------------------------------------------------------------------------
    367:--------------------------------------------------------------------------------
    368:--------------------------------------------------------------------------x-----
    369:--------------------4-----------------------------------------------------------
    370:--0-----------------------------------------------------------------------------
    371:
    372:
    373:--------------------------------------------------------------------|
    374:--------------------------------------------------------------------|
    375:------------0--------2--------3h----2h----0-----2-------------------|
    376:---2-----------------------------------------------------2----------|
    377:--------------------------------------------------------------------|
    378:--------------------------------------------------------------------|

В настоящее время в строку выводится только 80 символов, поэтому остальные данные сохраняются в следующей группе.Например, строка 365 соответствует строке 373.

Только для строк, которые не содержат вертикальную черту (т. Е. Строки 365-370), я пытаюсь 1) добавить строку, которая находится на расстоянии 8 строк,затем 2) удалите добавленную строку после того, как она была напечатана.

Итак, в идеале:

    365:----------------------------------------------------------------------------------------------------------------------------------------------------|
    366:----------------------------------------------------------------------------------------------------------------------------------------------------|
    367:--------------------------------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------|
    368:--------------------------------------------------------------------------x--------2-----------------------------------------------------2----------|
    369:--------------------4-------------------------------------------------------------------------------------------------------------------------------|
    370:--0-------------------------------------------------------------------------------------------------------------------------------------------------|

Я могу выделить строки, которые не содержат вертикальную черту, используя grep

grep -vn \| song.txt

Я знаю, что SED или AWK, вероятно, моя лучшая ставка, но я не знаю, как действовать дальше.

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Это может работать для вас (утилиты GNU);

sed '/^$/d' file |
split -nr/6 --filter 'cat'|
paste -sd'\0'|
sed 's/|/&\n/g;s/\n$//'

Это удаляет все пустые строки с помощью sed, разбивает файл на 6 с использованием метода циклического перебора и вместо создания отдельных файлов выводит всефайлы чередуются в стандартный вывод.Затем строки вставляются в длинные строки (по одной на строку) и разделяются на более короткие строки, используя | в качестве разделителей записей.

0 голосов
/ 28 января 2019

Я обычно использую программу vim для этого типа работы.Например, если у вас есть файл с именем file_name.txt со следующим содержимым

-------------------------8----
------------0--------2--------|
---2--------------------------|
------------------aaa---------|

---------------984asds--------|
---------t6776----------------|

со следующей командой

vim -c ":6y" -c ":put" -c ":1" -c ":join!" -c ":6d" -c ":wq" file_name.txt

, программа откроет file_name.txt в первой строке, скопируйтев шестой строке вставьте содержимое, скопированное во вторую строку (следующую строку), перейдите к первой строке, соедините первую строку со второй, удалите скопированную строку (шестая строка), сохраните и закройте файл.Таким образом, эта команда выдает следующий результат

-------------------------8-------------------984asds--------|
------------0--------2--------|
---2--------------------------|
------------------aaa---------|

---------t6776----------------|
0 голосов
/ 28 января 2019

Просто помассируйте этот подход, чтобы он подходил:

$ seq 16 | awk 'NR>8{print a[NR%8], $0} {a[NR%8]=$0}'
1 9
2 10
3 11
4 12
5 13
6 14
7 15
8 16

например, предполагая 2 пустые строки в конце ввода, чтобы получить блоки из 8 строк:

$ awk 'NR>8{print a[NR%8] $0} {a[NR%8]=$0}' file
--------------------------------------------------------------------------------------------------------------------------------------------------|
--------------------------------------------------------------------------------------------------------------------------------------------------|
------------------------------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------|
-------------------------------------------------------------------------x-------2-----------------------------------------------------2----------|
-------------------4------------------------------------------------------------------------------------------------------------------------------|
-0------------------------------------------------------------------------------------------------------------------------------------------------|

или, если выне иметь пустых строк после последнего блока:

$ awk '!NF{next} ++cnt>6{print a[NR%6] $0} {a[NR%6]=$0}' file
--------------------------------------------------------------------------------------------------------------------------------------------------|
-------------------------------------------------------------------------x------------------------------------------------------------------------|
-------------------4----------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------|
-0-------------------------------------------------------------------------------2-----------------------------------------------------2----------|
--------------------------------------------------------------------------------------------------------------------------------------------------|
--------------------------------------------------------------------------------------------------------------------------------------------------|
0 голосов
/ 28 января 2019

Немного некрасиво, но работает:

Разделите ваш ввод:

egrep -v "^$|\|" song.txt >file1
egrep    "\|"    song.txt >file2

И соедините это вместе:

paste -d "" file1 file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...