Объединить совпадающие строки, используя sed или awk? - PullRequest
3 голосов
/ 21 января 2010

У меня есть файл, подобный следующему:

1,  
cake:01351  
12,  
bun:1063  
scone:13581  
biscuit:1931  
14,  
jelly:1385

Мне нужно преобразовать его так, чтобы при чтении числа в начале строки оно объединялось со строкой под ним, но если в начале не было номера, строка оставалась как есть. Это будет вывод, который мне нужен:

1,cake:01351  
12,bun:1063  
scone:13581  
biscuit:1931  
14,jelly:1385

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

Любые предложения с благодарностью.

Ответы [ 5 ]

18 голосов
/ 21 января 2010

Очень базовая sed реализация:

sed -e '/^[0-9]/{N;s/\n//;}'

Это полагается на первый символ только на строки 'number' являются числом (как вы указали).

Он

  • соответствует строкам, начинающимся с цифры, ^[0-9]
  • приносит следующую строку, N
  • удаляет внедренный перевод строки, s/\n//
1 голос
/ 11 марта 2011

Еще одно решение awk, менее загадочное, чем некоторые другие ответы:

awk '/^[0-9]/ {n = $0; getline; print n $0; next} 1'
1 голос
/ 21 января 2010

Попробуйте использовать регулярное выражение, например:

sed '/[0-9]\+,/{N}s/\n//)'

Проверяет в первой строке число (0-9) и запятую, а затем заменяет новую строку ничем, удаляя ее.

1 голос
/ 21 января 2010

Это файл в моей внутренней сети. Я не могу вспомнить, где я нашел удобный sed однострочный. Вы можете найти что-нибудь, если будете искать «sed one-liner»


Вам когда-нибудь нужно было комбинировать строки текста, но слишком утомительно это делать вручную.

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

14/04/2003,10:27:47,0
IdVg,3.000,-1.000,0.050,0.006
GmMax,0.011,0.975,0.005
IdVg,3.000,-1.000,0.050,0.006
GmMax,0.011,0.975,0.005
14/04/2003,10:30:51,600
IdVg,3.000,-1.000,0.050,0.006
GmMax,0.011,0.975,0.005
IdVg,3.000,-1.000,0.050,0.006
GmMax,0.010,0.975,0.005
14/04/2003,10:34:02,600
IdVg,3.000,-1.000,0.050,0.006
GmMax,0.011,0.975,0.005
IdVg,3.000,-1.000,0.050,0.006
GmMax,0.010,0.975,0.005

Каждая дата (14/04/2003) является началом записи данных и продолжается в следующих четырех строках.

Мы хотели бы ввести это в Excel в виде файла с разделением запятыми и увидеть каждую запись в отдельной строке.

В нашем примере нам нужно добавить любую строку, начинающуюся с G или I, к предыдущей строке и вставить запятую, чтобы получить следующее:

14/04/2003,10:27:47,0,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.005,IdVg,3.000,...  
14/04/2003,10:30:51,600,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.0005,IdVg,3.000,...
14/04/2003,10:34:02,600,IdVg,3.000,-1.000,0.050,0.006,GmMax,0.011,0.975,0.0005,IdVg,3.000,...

Это классическое применение «регулярного выражения», и снова в помощь приходит sed.

Редактирование можно выполнить одной командой sed:

sed -e :a -e '$!N;s/\n\([GI]\)/,\1/;ta' -e 'P;D' filename >newfilename

Я не говорил, что это будет очевидно или просто, не так ли?

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

0 голосов
/ 21 января 2010
$ awk 'ORS= /^[0-9]+,$/?" ":"\n"' file
1, cake:01351
12, bun:1063
scone:13581
biscuit:1931
14, jelly:1385
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...