Использование sed для удаления символов новой строки из середины поля - PullRequest
1 голос
/ 05 мая 2011

данные у меня выглядят примерно так

a,b,c,d
a,b1
b2,c,d
A,B,C,D

Что происходит, так это то, что в поле 2 иногда появляется символ новой строки во втором поле, поэтому строка разбивается на две строки

Пока что я нашел скрипт sed, который будет делать это, он читает как

cat file| sed ':a;N;$!ba;s/\(\(b1\)\)\n/\1/g'

но я изо всех сил пытаюсь получить правильные комбинации (. *,), Чтобы сделать эту работу, поэтому я заменил ее на b1, чтобы этот пример работал, но в реальном мире A, B, C и D являются полями смешанной длины и содержания

Конечный результат, который я ищу, это

a,b,c,d
a,b1b2,c,d
A.B,C,D

Любая помощь очень ценится

Спасибо Matt

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

У меня есть решение, которое еще не идеально, но я еще подумаю об этом.Если ваша версия sed поддерживает расширенные регулярные выражения, вы можете сделать:

cat file | sed -r ':a;N;$!ba;s/((^|\n)([^,]+,){0,2}[^,]+)\n/\1/g'

Это сработает, если в одном из первых трех столбцов будет разрыв строки.До сих пор он не работал с несколькими разрывами строк в «строке».

Объяснение:
(^|\n) соответствует началу строки (соответственно, разрыв строки)
[^,]+, означает: хотя бы один (+ означает еще один символ)! = ",", За которым следует ","
([^,]+,){0,2}, если есть 0-2 столбца, разделенных знаком","
* [^,]+ означает, что после 0-2 столбцов есть некоторый (хотя бы один) символ! = ",".
Трейлинг \n соответствует разрыву строки

Суммируя, команда s сопоставит все строки, содержащие 0-3 столбца, с разрывом строки в конце и заменит его на себя (\1), исключая разрыв задней строки.

0 голосов
/ 06 мая 2011

В awk

awk -F, 'NF < 4 {getline nextline; $0 = $0 nextline} 1' filename
...