2015-02-19 3 views
-1

Скажем, у меня есть это в файле (FIX Message)Unix Bash - значения поля печати шаблон согласования

 
35=D|11=ABC|52=123456|33=AA|44=BB|17=CC 
35=D|33=ABC|11=123456|44=ZZ|17=EE|66=YY 

Я хочу Grep и печатать только значения после 11= и 17=, выход, как это.

 
ABC|CC 
123456|EE 

Как это достичь?

+3

Что вы пробовали? Этого можно легко достичь с помощью ['sed'] (http://man7.org/linux/man-pages/man1/sed.1.html) или [' awk'] (http://man7.org/ Linux/человеко-страниц/man1/gawk.1.html). –

ответ

0

через СЭД,

$ sed 's/.*\b11=\([^|]*\).*\b17=\([^\|]*\).*/\1|\2/g' file 
ABC|CC 
123456|EE 

Через Grep и пасты.

$ grep -oP '\b11=\K[^|]*|\b17=\K[^|]*' file | paste -d'|' - - 
ABC|CC 
123456|EE 
3

Всякий раз, когда там имя = значение пары во входных данных я считаю полезным для ясности, будущих улучшений и т.д., чтобы создать массив name2value, а затем использовать его для печати значений по имени:

$ cat tst.awk 
BEGIN { FS="[|=]"; OFS="|" } 
{ 
    delete n2v 
    for (i=1; i<=NF; i+=2) { 
     n2v[$i] = $(i+1) 
    } 
    print n2v[11], n2v[17] 
} 
$ awk -f tst.awk file 
ABC|CC 
123456|EE 
0

Другое awk

awk -F"11=|17=" '{for (i=2;i<NF;i++) {split($i,a,"|");printf "%s|",a[1]}split($i,a,"|");print a[1]}' file 
ABC|CC 
123456|EE 
Смежные вопросы