2015-09-18 3 views
0

У меня есть следующие данные (внизу) в текстовом файле. Я использую awk для изменения строки в столбце, но человек это грязный.Чистый способ awk этой строки

cat 5_lines.txt |awk -F\' '{print $1,"\n" "\n" $2,"\n" $3,"\n" $4,"\n" $5,"\n" $6,"\n" $7,"\n" $8,"\n" $9,"\n" $10,"\n" $11,"\n" $12,"\n" $13,"\n" $14,"\n" $15,"\n" $16,"\n" $17,"\n" $18,"\n" $19,"\n" $20,"\n" $21,"\n" $22,"\n" $23,"\n" $24,"\n" $25,"\n" $26,"\n" $27,"\n" $28,"\n" $29,"\n" $30,"\n" $31,"\n" $32,"\n" $33,"\n" $34"\n"}'|sed -e 's/ */ /g' -e 's/\[//g' -e 's/,//g' 

Я бы по достоинству оценил некоторые предложения по сокращению части awk этой команды. Заранее спасибо.

#### Ожидаемый результат
BBBB 4575 XXX.YYY.ZZZ.191  
part = TBD Part  
model = TBD Model  
serial = TBD Serial  
wpn = TBD WPN  
feature = 0  
mods =  
date = 0-00-00 00:00:00  
hours = 0  
key1 = 0  
key2 = 0  
key3 = 0  
key4 = 0  
key5 = 0  
key6 = 0  
key7 = 0  
key8 = 0  
14 

BBBB 4576 XXX.YYY.ZZZ.121  
part = TBD Part  
model = TBD Model  
serial = TBD Serial  
wpn = TBD WPN  
feature = 0  
mods =  
date = 0-00-00 00:00:00  
hours = 0  
key1 = 0  
key2 = 0  
key3 = 0  
key4 = 0  
key5 = 0  
key6 = 0  
key7 = 0  
key8 = 0  
14 

BBBB 4578 XXX.YYY.ZZZ.162  
part = TBD Part  
model = TBD Model  
serial = TBD Serial  
wpn = TBD WPN  
feature = 0  
mods =  
date = 0-00-00 00:00:00  
hours = 0  
key1 = 0  
key2 = 0  
key3 = 0  
key4 = 0  
key5 = 0  
key6 = 0  
key7 = 0  
key8 = 0  
14 

BBBB 4580 XXX.YYY.ZZZ.179  
part = TBD Part  
model = TBD Model  
serial = TBD Serial  
wpn = TBD WPN  
feature = 0  
mods =  
date = 0-00-00 00:00:00  
hours = 0  
key1 = 0  
key2 = 0  
key3 = 0  
key4 = 0  
key5 = 0  
key6 = 0  
key7 = 0  
key8 = 0  
14 

BBBB 4581 XXX.YYY.ZZZ.15  
part = TBD Part  
model = TBD Model  
serial = TBD Serial  
wpn = TBD WPN  
feature = 0  
mods =  
date = 0-00-00 00:00:00  
hours = 0  
key1 = 0  
key2 = 0  
key3 = 0  
key4 = 0  
key5 = 0  
key6 = 0  
key7 = 0  
key8 = 0  
14 
#

Raw Data

BBBB 4575 XXX.YYY.ZZZ.191 part = TBD Part model = TBD Model serial = TBD Serial wpn = TBD WPN feature = 0 mods = date = 0-00-00 00:00:00 hours = 0 key1 = 0 key2 = 0 key3 = 0 key4 = 0 key5 = 0 key5 = 0 key6 = 0 key7 = 0 key8 = 0 14  
BBBB 4576 XXX.YYY.ZZZ.121 part = TBD Part model = TBD Model serial = TBD Serial wpn = TBD WPN feature = 0 mods = date = 0-00-00 00:00:00 hours = 0 key1 = 0 key2 = 0 key3 = 0 key4 = 0 key5 = 0 key5 = 0 key6 = 0 key7 = 0 key8 = 0 14  
BBBB 4578 XXX.YYY.ZZZ.162 part = TBD Part model = TBD Model serial = TBD Serial wpn = TBD WPN feature = 0 mods = date = 0-00-00 00:00:00 hours = 0 key1 = 0 key2 = 0 key3 = 0 key4 = 0 key5 = 0 key5 = 0 key6 = 0 key7 = 0 key8 = 0 14  
BBBB 4580 XXX.YYY.ZZZ.179 part = TBD Part model = TBD Model serial = TBD Serial wpn = TBD WPN feature = 0 mods = date = 0-00-00 00:00:00 hours = 0 key1 = 0 key2 = 0 key3 = 0 key4 = 0 key5 = 0 key5 = 0 key6 = 0 key7 = 0 key8 = 0 14  
BBBB 4581 XXX.YYY.ZZZ.15 part = TBD Part model = TBD Model serial = TBD Serial wpn = TBD WPN feature = 0 mods = date = 0-00-00 00:00:00 hours = 0 key1 = 0 key2 = 0 key3 = 0 key4 = 0 key5 = 0 key5 = 0 key6 = 0 key7 = 0 key8 = 0 14 
+2

Каков ваш ожидаемый результат? – anubhava

+2

Команда awk использует '' 'как разделитель полей, но этот символ не появляется в вашем примере ввода. Команда sed удаляет '[', но этот символ также не появляется на входе. _Пожалуйста, ясно покажите, каков ваш реальный вход и какой желаемый результат. _ – John1024

+0

Они должны быть удалены администратором. Строка выглядит так: BNSF 4575 10.145.181.191 ['part = TBD Part', 'model = TBD Model', 'serial = TBD Serial', 'wpn = TBD WPN', 'feature = 0', 'mods =' , 'date = 0-00-00 00:00:00', 'hours = 0', 'key1 = 0', 'key2 = 0', 'key3 = 0', 'key4 = 0', 'key5 = 0 ',' key6 = 0 ',' key7 = 0 ',' key8 = 0 ',' 14 '] – teamg

ответ

1

Если вы не настаиваем на AWK это может быть лучшим вариантом

cat yourfile.txt | tr '[' ',' | tr -d "['\]]" | sed 's/, /\n/g' 
+0

Да, это то, что я искал. Можете ли вы объяснить, почему запятая там? – teamg

+0

Мне все еще нужно объяснять? –

+0

Это было бы здорово. – teamg

0

дают это СЭД однострочное приложение:

sed -r 's/\S+\s*$/\n&/;s/\S+\s=/\n&/g' file 

Эта линия дает ожидаемый результат.

1

Учитывая Ваш недавно опубликовал ожидаемые результаты:

$ cat tst.awk 
{ 
    delete f 
    nf=1 
    for (i=1;i<NF;i++) { 
     if ($(i+1) == "=") { 
      nf++ 
     } 
     f[nf] = (f[nf]=="" ? "" : f[nf] OFS) $i 
    } 
    f[++nf] = $i 

    for (i=1; i<=nf; i++) { 
     print f[i] 
    } 
    print "" 
} 

.

$ awk -f tst.awk file 
BBBB 4575 XXX.YYY.ZZZ.191 
part = TBD Part 
model = TBD Model 
serial = TBD Serial 
wpn = TBD WPN 
feature = 0 
mods = 
date = 0-00-00 00:00:00 
hours = 0 
key1 = 0 
key2 = 0 
key3 = 0 
key4 = 0 
key5 = 0 
key5 = 0 
key6 = 0 
key7 = 0 
key8 = 0 
14 

BBBB 4576 XXX.YYY.ZZZ.121 
part = TBD Part 
model = TBD Model 
serial = TBD Serial 
wpn = TBD WPN 
feature = 0 
mods = 
date = 0-00-00 00:00:00 
hours = 0 
key1 = 0 
key2 = 0 
key3 = 0 
key4 = 0 
key5 = 0 
key5 = 0 
key6 = 0 
key7 = 0 
key8 = 0 
14 

BBBB 4578 XXX.YYY.ZZZ.162 
part = TBD Part 
model = TBD Model 
serial = TBD Serial 
wpn = TBD WPN 
feature = 0 
mods = 
date = 0-00-00 00:00:00 
hours = 0 
key1 = 0 
key2 = 0 
key3 = 0 
key4 = 0 
key5 = 0 
key5 = 0 
key6 = 0 
key7 = 0 
key8 = 0 
14 

BBBB 4580 XXX.YYY.ZZZ.179 
part = TBD Part 
model = TBD Model 
serial = TBD Serial 
wpn = TBD WPN 
feature = 0 
mods = 
date = 0-00-00 00:00:00 
hours = 0 
key1 = 0 
key2 = 0 
key3 = 0 
key4 = 0 
key5 = 0 
key5 = 0 
key6 = 0 
key7 = 0 
key8 = 0 
14 

BBBB 4581 XXX.YYY.ZZZ.15 
part = TBD Part 
model = TBD Model 
serial = TBD Serial 
wpn = TBD WPN 
feature = 0 
mods = 
date = 0-00-00 00:00:00 
hours = 0 
key1 = 0 
key2 = 0 
key3 = 0 
key4 = 0 
key5 = 0 
key5 = 0 
key6 = 0 
key7 = 0 
key8 = 0 
14 

Обратите внимание, что первый цикл в сценарии мог бы просто сделать print С - f[] массива используется только для хранимых полей (выходные линий), так что они доступны для вас, если вы хотите сделать что-либо дополнительное с полями после их идентификации.


EDIT: Я вижу из одного из ваших комментариев, что ваш формат ввода на самом деле НЕ является тем, что вы опубликовали в своем вопросе. Вместо этого он выглядит следующим образом:

$ cat file 
BNSF 4575 10.145.181.191 ['part = TBD Part', 'model = TBD Model', 'serial = TBD Serial', 'wpn = TBD WPN', 'feature = 0', 'mods = ', 'date = 0-00-00 00:00:00', 'hours = 0', 'key1 = 0', 'key2 = 0', 'key3 = 0', 'key4 = 0', 'key5 = 0', 'key6 = 0', 'key7 = 0', 'key8 = 0', '14'] 

Это делает решение гораздо проще:

$ awk -F"', '" -v OFS='\n' -v ORS='\n\n' '{sub(/ \[\047/,OFS,$1); sub(/\047\]/,"",$NF)}1' file 
BNSF 4575 10.145.181.191 
part = TBD Part 
model = TBD Model 
serial = TBD Serial 
wpn = TBD WPN 
feature = 0 
mods = 
date = 0-00-00 00:00:00 
hours = 0 
key1 = 0 
key2 = 0 
key3 = 0 
key4 = 0 
key5 = 0 
key6 = 0 
key7 = 0 
key8 = 0 
14 

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

+0

Это решение не сработало для меня. – teamg

+0

Вы правы, я должен был быть более наглядным. Ниже приведен вывод, который я получаю, создав файл tst.awk, а затем запустив его с предоставленным вами синтаксисом. (Я не публиковал его изначально, потому что выход был слишком большим для этого редактора.) # Awk -f tst.awk tmp/file.out BBBB 4575 XXX.YYY.ZZZ.191 BBBB 4576 XXX.YYY.ZZZ.121 part = TBD Часть части = TBD Часть – teamg

+0

Глядя на мое оригинальное сообщение, вы найдете пять строк, начинающихся с BBBB. Эти пять строк находятся в файле. Когда я использую ваш пример, первый вывод правильный, но второй, третий, четвертый и пятый или нет. Поэтому вместо того, чтобы иметь BBBB 4575 XXX.YYY.ZZZ.191, я получаю BBBB 4575 XXX.YYY.ZZZ.191 BBBB 4576 XXX.YYY.ZZZ.121 в той же строке. Таким образом, он выводит их на одной строке. В последней строке есть все пять записей BBBB на одной строке. – teamg

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