Предположим, у меня есть | отдельный текстовый файл, как это:

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», его следует заменить значением в вышеприведенной строке.

1
Naveed 29 Май 2019 в 19:56

2 ответа

Лучший ответ
$ 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
2
Ed Morton 29 Май 2019 в 16:59

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

sed -E 'N;s/^(([^|]*).*\n)xxx/\1\2/;P;D' file

Добавьте следующую строку к текущей строке и, если эта добавленная строка начинается xxx, замените эту строку первым полем текущей строки. Распечатать / удалить текущую строку и повторить.

1
potong 30 Май 2019 в 15:45