2013-03-07 3 views
1

Я пытаюсь с awk или sed удалять \ n, когда они являются двумя тегами.Удалить n (новая строка) между двумя символами

Пример: csv файл с новой строкой в ​​одном столбце. Мне нужно удалить эту новую строку, но не текст, а не новую строку между каждой строкой.

row1-col1;row1- 
col2; 
row2-col1;row2- 
col2; 

Должно выглядеть так:

row1-col1;row1-col2; 
row2-col1;row2-col2; 

У меня есть много попробовать фильтр без Succes, и теперь я немного путают.

Спасибо за помощь

ответ

0

Если ваши линии всегда разделены на -, то вы можете использовать следующий скрипт: sed

sed ':a;N;$!ba;s/-\n/-/g' file.txt 
+0

Я попробовал его на моем макинтош терминале, но это не работает ... – Barney

+0

@Barney Я очень сожалею, но я не могу проверить его на Mac терминал , Я на Ubuntu, и он работает, как ожидалось, на моем терминале. – jitendra

0

Один из способов, используя sed. Он добавляет весь ввод до последней строки ($!), а затем удаляет все строки новой строки с предшествующим -.

sed -n ':a ; $! { N; b a }; s/-\n/-/g ; p' infile 

Это дает:

row1-col1;row1-col2; 
row2-col1;row2-col2; 
+0

Я пробовал это, но выхода не было. Если это имеет значение, я использую терминал mac. – Barney

1

Если это действительно только вопрос конкатенации любой другой линии, вы можете сделать что-то вроде этого:

awk '(NR % 2) == 1 { saved=$0; next; } { printf("%s%s\n", saved, $0); }' file.txt 

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

1

попробовать это:

awk '{if ($0~/;$/)print $0;else printf $0}' file 
+1

Никогда не используйте 'print $ 0', вместо этого используйте' printf '% s ", $ 0'. Попробуйте, когда входной файл содержит «% s» или какую-либо другую директиву форматирования printf. –

0
$ cat file      
row1-col1;row1- 
col2; 
row2-col1;row2- 
col2; 

$ awk '{ORS=(NR%2?"":"\n")}1' file 
row1-col1;row1-col2; 
row2-col1;row2-col2; 
Смежные вопросы