Предположим, у меня есть | отдельный текстовый файл, например:
123|col 2 row 1|col 3 row 1
xxx|col 2 row 2|col 3 row 2
xxx|col 2 row 3|col 3 row 3
789|col 2 row 4|col 3 row 4
xxx|col 2 row 5|col 3 row 5
xxx|col 2 row 6|col 3 row 6
Используя sed
или awk
, как это получить:
123|col 2 row 1|col 3 row 1
123|col 2 row 2|col 3 row 2
123|col 2 row 3|col 3 row 3
789|col 2 row 4|col 3 row 4
789|col 2 row 5|col 3 row 5
789|col 2 row 6|col 3 row 6
Если значение столбца 1 равно «xxx», оно должно быть заменено значением в строке выше.
$ awk 'BEGIN{FS=OFS = "|"} {if ($1= = "xxx") $1=p; else p=$1} 1' file
123|col 2 row 1|col 3 row 1
123|col 2 row 2|col 3 row 2
123|col 2 row 3|col 3 row 3
789|col 2 row 4|col 3 row 4
789|col 2 row 5|col 3 row 5
789|col 2 row 6|col 3 row 6
Это может сработать для вас (GNU sed):
sed -E 'N;s/^(([^|]*).*\n)xxx/\1\2/;P;D' file
Добавьте следующую строку к текущей строке, и если эта добавленная строка начинается xxx
, замените эту строку первым полем текущей строки. Распечатать/удалить текущую строку и повторить.