2013-04-19 5 views
1

У меня есть текстовый файл со случайными разрывами строк. Все новые строки начинаются со слова «клиент». Как удалить дополнительные разрывы строк, как показано в конце второй и третьей строки?Объединить несколько последовательных строк в один, удалив разрывы строк

client | This is first row | 2013-02-01 23:45:59 | last column 
clientd | second row with a line break 
third line part of row 2 | 2013-01-31 12:44:00 | last column 
client xyz | some text here | 2013-12-21 
12:54:12 | last column 

Ожидаемый результат:

client | This is first row | 2013-02-01 23:45:59 | last column 
clientd | second row with a line break third line part of row 2 | 2013-01-31 12:44:00 | last column 
client xyz | some text here | 2013-12-21 12:54:12 | last column 

СЕПГ команда работает, но я искал каких-либо улучшений, если это возможно.

cat test.txt | tr '\n' ' ' | sed 's/client/\nclient/g' 

Есть ли другой способ добиться этого?

+0

Поскольку у вас уже есть рабочий код, я думаю, что это лучше подходит для проверки кода. (хотя это тонкая линия) – mgilson

+0

Также обсуждается, считаются ли инструменты командной строки программированием. – JJJ

+0

@juhana: если это завершение, это конечно программирование :). Во всяком случае, есть довольно большой раздел SO, посвященный bash (который обычно считается включенным, по крайней мере, стандартными инструментами POSIX); Я не думаю, что ты можешь просто написать это так. – rici

ответ

0

Один из способов:

awk '/^client/{if (x)print x;x=$0;next}{x=x FS $0;}END{print x}' file 

Каждый раз, когда запись клиента встречается, печать предыдущей записи и начать накапливать текущую запись в переменной х до следующей записи клиента не извлекается.

1

Вот еще один AWK-лайнер:

awk -vRS='(^|\n)client' 'NR>1{print "client"gensub("\n"," ","g",$0)}' file 

, который работает, установив разделитель (RS) в регулярное выражение, которое соответствует client в начале строки.

Также можно написать регулярное выражение, которое будет соответствовать новой строке, за которой следует что-то другое, чем client, но это не очень:

\n([^c]|c[^l]|cl[^i]|cli[^e]|clie[^n]|clien[^t]) 

Если ваши файлы данные не слишком большие, чтобы прочитать весь файл в памяти, вы можете использовать выше Perl, например:

perl -0777pe "s/\n([^c]|c[^l]|cl[^i]|cli[^e]|clie[^n]|clien[^t])/ \1/g" file 

(выше несовершенен, потому что «не соответствует» символ в каждой альтернативе может быть символ новой строки, в этом случае он не будет изменен к пространству. Его можно исправить b у меняется каждый экземпляр [^X] к (?:$|[^X]), что вы должны сделать, если вы действительно хотите использовать)

0

Python

>>> with open('test.txt') as fin: 
     print fin.readline().rstrip(), # don't prepend \n to first line 
     for line in fin: 
      print line.rstrip().replace('client', '\nclient'), 


client | This is first row | 2013-02-01 23:45:59 | last column 
clientd | second row with a line break third line part of row 2 | 2013-01-31 12:44:00 | last column 
client xyz | some text here | 2013-12-21 12:54:12 | last column 
0

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

sed -r ':a;$!N;/^(client).*\n\1/!{s/\n/ /;ta};P;D' file 

Это заменяет дополнительные строки новой строки пробелами, если помещения не требуются:

sed -r ':a;$!N;/^(client).*\n\1/!{s/\n//;ta};P;D' file 
Смежные вопросы