AWK: объединить шаблон сопоставления с разделителем полей - PullRequest
0 голосов
/ 29 ноября 2018

Входной файл:

cat /tmp/filename

app_name="MysqlCluster"
whatever whatever
whatever whatever
whatever whatever
whatever whatever
region="Europe"

Ожидаемый результат:

MysqlCluster_Europe

Попытки:

root@localhost:~# awk -F\" '/app_name|region/ {printf "%s_", $2}' /tmp/filename
MysqlCluster_Europe_root@localhost:~# 

root@localhost:~# awk -F\" '/app_name|region/ {OFS="_"; printf "%s", $2}' /tmp/filename
MysqlClusterEuroperoot@localhost:~#

root@localhost:~# awk -F\" '/app_name|region/ {printf "%s_", $2} END{print} ' /tmp/filename
MysqlCluster_Europe_

And few other attempts on similar lines but have not been successful.

Я ищу:

root@localhost:~# awk <here goes some awk magic> /tmp/filename
MysqlCluster_Europe    <<< NOTE: No Underscore at the end

Ответы [ 5 ]

0 голосов
/ 30 ноября 2018
$ awk -F'=?"' '{f[$1]=$2} $1=="region"{print f["app_name"] "_" $2}' file
MysqlCluster_Europe
0 голосов
/ 29 ноября 2018

Не могли бы вы попробовать выполнить один раз.

awk -F'"' '/app_name/{val=$(NF-1);next} /region/{print val "_" $(NF-1)}'  Input_file

Вывод будет следующим.

MysqlCluster_Europe

Объяснение: Добавление объяснениядля вышеуказанного кода сейчас.

awk -F'"' '                 ##Setting field separator as " here for all lines.
/app_name/{                 ##Checking condition if a line has string app_name then do following.
  val=$(NF-1)               ##Creating variable named val whose value is 2nd last field of current line.
  next                      ##Using next keyword will skip all further statements from here.
}                           ##Closing block for this condition here.
/region/{                   ##Checking condition if a line has string region then do following.
  print val "_" $(NF-1)     ##Printing variable val and OFS and $(NF-1) here.
  val=""                    ##Nullifying variable val here.
}
'  Input_file               ##Mentioning Input_file name here.
0 голосов
/ 29 ноября 2018

Здесь с регулярным выражением, которое соответствует app_name и региону в column1, а затем разделяется символом "=".

awk '$1 ~ "app_name|region" {split($0,a,"="); printf a[2]}' /tmp/filename | sed 's/"//g'

sed удаляет двойные кавычки.

BR

0 голосов
/ 29 ноября 2018

Использование GNU awk.Это должно работать, даже если в файле (файлах) больше пар app_name-region:

$ awk '
/^(app_name|region)=/ {                     # look for matching records
    a[++c][1]                               # initialize 2d array 
    split($0,a[c],"\"")                     # split on quote
}
END {                                       # after processing file(s)
    for(i=1;i in a;i++)                     # loop all stored values
        printf "%s%s",a[i][2],(i%2?"_":ORS) # output
}' file
MysqlCluster_Europe
0 голосов
/ 29 ноября 2018

Следующие будут работать для вашего примера.(Тем не менее, он не будет печатать перевод строки.)

awk -F\" '/^(app_name|region)/ { printf "%s%s", s, $2; s="_" }' /tmp/filename

Совсем не уменьшать ваши усилия, но обработка app_name и region в двух отдельных действиях была бы более практичной, с моей точки зрения, так будетподдержка нескольких пар app_name-region.

awk -F\" '/^app_name/ { printf "%s_", $2 } /^region/ { print $2 }' /tmp/filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...