Обработка текста - Добавлять следующую строку с предыдущей, пока строки не заканчиваются на «^» - PullRequest
0 голосов
/ 26 марта 2019

У меня есть текстовый файл, который содержит данные в следующем формате.

1^0^this is test file line1^
2^1^this is test file line2^
3^1^this
is
test
file line3^
4^1^this
is
file line4^

до тех пор, пока следующая строка не заканчивается на ^, необходимо добавить предыдущую строку

Выход:

1^0^this is test file line1^
2^1^this is test file line2^
3^1^this is test file line3^
4^1^this is file line4^

Ответы [ 4 ]

3 голосов
/ 26 марта 2019

Манипулировать значением разделителя выходных записей (ORS) в соответствии с окончаниями строки.

$ awk '{ORS=/\^$/?"\n":" "}1' file
1^0^this is test file line1^
2^1^this is test file line2^
3^1^this is test file line3^
4^1^this is file line4^
0 голосов
/ 26 марта 2019

Еще один sed, использующий малоизвестный трюм:

$ sed -ne '/[^^]$/{H;d}; {H;g;s/\n/ /g;p;s/.*//;h}' test.txt; 
^1^0^this is test file line1^
^2^1^this is test file line2^
^3^1^this is test file line3^
^4^1^this is file line4^

В основном: если текущая строка ( пробел ) не заканчивается на ^, добавьте ее в пробел и переходите к следующей строке. В противном случае снова добавьте текущую строку в пространство удержания, затем замените текущее пространство шаблона на пространство удержания, обработайте строки, добавленные на H, и напечатайте результат. Затем освободите пространство удержания при подготовке к следующей последовательности строк (к сожалению, кажется, что сделать этот последний бит за один шаг не так-то просто)

Примечания:

  • Это будет иметь проблемы, если последняя строка ввода не заканчивается на ^.
  • При использовании GNU sed замените s/.*// на z.
0 голосов
/ 26 марта 2019

С GNU sed 4.2 (опция поддержки -z) вы можете использовать

sed -rz 's/([^^])\n/\1/g' file

С более старым sed вы можете использовать

tr "\n" "\r" < file | sed -r 's/([^^])\r/\1/g' | tr "\r" "\n"

РЕДАКТИРОВАТЬ: Когда вам нужны пробелымежду соединенными строками используйте

sed -rz 's/([^^])\n/\1 /g' file
0 голосов
/ 26 марта 2019

Дешевый и простой скрипт bash. Вместо того, чтобы искать висячую морковь, она ищет номер ведущей и морковь.

#!/bin/bash

filename=$HOME/asdf.txt
prevLine=""
while IFS= read -r var
do
    if [[ $var =~ ^[0-9]{1}\^.*$ ]]
    then
        echo "$prevLine"
        prevLine=""
        prevLine="$var"
    else
        prevLine+=" $var"
    fi
done < "$filename"
echo "$prevLine"
...