2010-01-20 4 views
3

У меня есть файл, как следующее:Объединить соответствующие линии с помощью sed или awk?

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 

Имея много хлопот достижения этой цели с СЕПГ, кажется, что это не может быть лучшим способом для того, что я думаю, что должно быть довольно просто.

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

ответ

18

Очень простой sed реализация:

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

Это зависит от первого символа на только линии «число» означает число (как указано).

Она

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

голосовать за хорошее объяснение. – Anders

1

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


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

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

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 

Я не сказал, что было бы очевидно, или просто, не так ли?

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

1

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

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

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

+0

Это проверяет только одноразрядное число. Вам нужно '[0-9] \ +' –

+0

Ах, это не поймало. Исправлена. – pagboy

0
$ awk 'ORS= /^[0-9]+,$/?" ":"\n"' file 
1, cake:01351 
12, bun:1063 
scone:13581 
biscuit:1931 
14, jelly:1385 
1

Другого AWK решение, менее загадочно, чем некоторые другие ответы:

awk '/^[0-9]/ {n = $0; getline; print n $0; next} 1' 

 Смежные вопросы

  • Нет связанных вопросов^_^