4

У меня есть следующие данные

То, что я хотел бы сделать, это для каждой строки, где нет "555" в конце, я хочу удалить разрыв строки, \n, и заменить его пробелом.

Таким образом, "совпадающая линия" будет строкой без "555" в конце. Я хотел бы заменить разрыв строки из этих строк.

Я ограничен в том, что я не могу использовать Perl для этого. Итак, это должен быть АУК или САС. Но желательно, чтобы AWK, как я знаю, SED не так хорош для работы на нескольких линиях.

Вот 2 примера:

Пример 1

"abc","555"
"d
e
f","555"
"xyz","555"
"abc
d,e,f ghi
jkl
mnop,qrs","555"

Должен стать (после внесения поправок)

"abc","555"
" d e f","555"
"xyz","555"
"abc d,e,f ghi jkl mnop,qrs","555"

& Пример 2

"abc","555"
"d
e
f","555"
"xyz","555"
"aa
bb
cc
dd","555"

Должен стать (после внесения поправок)

"abc","555"
"d e f","555"
"xyz","555"
"aa bb cc dd","555"

Таким образом, в выводе необходимо, на самом деле каждая строка имеет формат

"content","555"

2 ответа2

4

Хитрость, в данном случае, не в том, чтобы думать о ней как о «работе над несколькими строками».

awk '/"555"$/ {print; next} {printf "%s ", $0}'

печатает каждую строку, которая обычно является последней строкой группы, и затем говорит next чтобы перейти к следующей строке ввода (без обработки оставшейся команды).  Оставшаяся команда, которая становится регистром по умолчанию, печатает текущую строку с пробелом без новой строки.  Это также может быть сделано как

awk '{if ($0 ~ /"555"$/) print; else printf "%s ", $0}'
1

Я не знаком с AWK, но вы можете сделать это в два этапа, сначала замените "555"\n на то, что вы никогда не встретите в своем файле, например «55555555555555555 ############ ######################### 444444444444444444444444444 ". Затем замените все \n пробелом

Впоследствии замените странную строку на "555"\n

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .