2017-02-15 19 views
3

Я хочу напечатать/эхо или перенаправлять ниже строки в какой-то файлИзменить несколько пар линий на отдельные строки?

phone: "3434343" 
name: "jack" 

phone: "9876735" 
name: "john" 

phone: "3434343" 
name: "Mack" 


...multiple emptylines ... 


phone: "9876735" 
name: "doe" 

phone: "3434343" 
name: "tack" 

желаемая выходные линии являются: -

phone: "3434343" name: "jack" 
phone: "9876735" name: "john" 

... 

Ниже то, что я написал работать

cat /tmp/sip_summary2.log | while read LINE; 
do 
echo $LINE | grep '^$' > /dev/null 
    if [ $? -eq 0 ] 
     then 
     echo " " >> /tmp/tempsip.log 
    else 
     printf "%s " "$LINE" >> /tmp/tempsip.log 
    fi 
done 

Есть ли лучшие или более чистые альтернативы для этого?

+1

я сузил свой вопрос несколько. Не рассылайте спам нескольким тегам для нескольких технических стеков. Задайте отдельный вопрос для решения Python (и включите в него свою собственную попытку). –

ответ

7

awk решение:

awk -v RS= '{$1=$1}1' inputfile 

Здесь по умолчанию RS изменяется на пустой. {$1=$1} предназначен для записи реконструкции и 1 предназначен для печати записи.

+2

это просто волшебство. Очень хороший ответ. –

+2

может быть дополнительно сокращен до 'awk '$ 1 = $ 1' RS = файл' – karakfa

4

Python решение. Читать построчно и распечатать с или без перехода на новую строку в зависимости от префикса:

with open("text.txt") as f: 
    for l in f: 
    l = l.strip() 
    if l.startswith("phone:"): 
     print(l,end=' ') 
    elif l.startswith("name:"): 
     print(l) 

печатает:

phone: "3434343" name: "jack" 
phone: "9876735" name: "john" 
phone: "3434343" name: "Mack" 
phone: "9876735" name: "doe" 
phone: "3434343" name: "tack" 
+0

Я удалил тег Python; альтернативой было бы закрытие вопроса слишком широким. –

+0

@MartijnPieters Я прекрасно понимаю. Не ответили бы, если тега здесь не было. –

1

Другое решение на основе Awk GetLine функции(),

awk 'NF{key=$0; getline; print key, $0;}' file 
phone: "3434343" name: "jack" 
phone: "9876735" name: "john" 
phone: "3434343" name: "Mack" 
phone: "9876735" name: "doe" 
phone: "3434343" name: "tack" 

т.е. каждая непустая строка, NF{}, сохраните текущую строку в переменной key, прочитайте следующую строку, которая теперь становится $0 и pri это.

1

С sed:

sed -e '/phone:/{N; /\nname/{s/\n/ /g;p;d}}' -e '/^\s*$/d' 

(ИЛИ)

sed -e '/phone:/{N; s/\n\(name:\)\?/ \1/}' -e '/^\s*$/d' 

Тест:

$ sed -e '/phone:/{N; /\nname/{s/\n/ /g;p;d}}' -e '/^\s*$/d' file 
phone: "3434343" name: "jack" 
phone: "9876735" name: "john" 
phone: "3434343" name: "Mack" 
phone: "9876735" name: "doe" 
phone: "3434343" name: "tack" 
0

В AWK, с использованием содержимого для управления print Ing:

$ awk '/^name/{print p, $0}/^phone/{p=$0}' file 
phone: "3434343" name: "jack" 
phone: "9876735" name: "john" 
phone: "3434343" name: "Mack" 

Если phone, укажите строку до p. Если nameprintp и текущая запись $0.

1

pr - хороший выбор для группировки последовательных линий.Например, группировка 10 строк как пять столбцов с , в качестве разделителя

$ seq 10 | pr -5ats, 
1,2,3,4,5 
6,7,8,9,10 


Для данного входа, предварительная обработка также необходима, чтобы получить только непустые строки

$ grep -vx '' ip.txt 
phone: "3434343" 
name: "jack" 
phone: "9876735" 
name: "john" 
phone: "3434343" 
name: "Mack" 
phone: "9876735" 
name: "doe" 
phone: "3434343" 
name: "tack" 

И затем использовать pr

$ grep -vx '' ip.txt | pr -2ats' ' 
phone: "3434343" name: "jack" 
phone: "9876735" name: "john" 
phone: "3434343" name: "Mack" 
phone: "9876735" name: "doe" 
phone: "3434343" name: "tack" 
0

Другое решение с использованием bash только

unset v; 
i=0; 
for d in `cat file`; do 
    v[$i]="$d"; 
    ((++i)); 
    if [ "$i" -eq 4 ]; then 
     printf '%s\n' "${v[*]}"; 
     i=0; 
    fi; 
done 

Другим решения с использованием paste и sed

sed '/^$/d' file | paste -d" " - - 

вы получите,

phone: "3434343" name: "jack" 
phone: "9876735" name: "john" 
phone: "3434343" name: "Mack" 
phone: "9876735" name: "doe" 
phone: "3434343" name: "tack"