Извлечение определенных полей из табличного файла с помощью awk - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть табличный файл с такой структурой:

NAME                    ZONE
comp-envA-teamA-c9     europe-west4-a
comp-envA-teamA-11b    europe-west4-c
comp-envA-teamB-7r-v6  europe-west4-b
comp-envB-teamB-hx86   europe-west4-a
comp-envB-teamC-lbn7   europe-west4-c
envB-teamC-lcnh        europe-west4-a

Я хотел бы извлечь часть этих строк, чтобы получить ожидаемый результат для первых строк:

"comp-envA-teamA-c9" is for "teamA" in zone "europe-west4-a"
"comp-envA-teamA-11b" is for "teamA" in zone "europe-west4-c"
"comp-envA-teamB-7r-v6" is for "teamB" in zone "europe-west4-b"

Я пыталсяс awk было много вещей, но я не смог с этим справиться ..

Вначале я хотел создать в исходном awk с разделителем tab массив, который назначит второй элемент первому: ie tab [comp-envA-teamA-c9] = europe-west4-a

и следующий через второй awk с разделителем "-" для получения информации о команде.

Однако я не смог создать такой массиви передать его второму awk

много, спасибо за любую помощь!

Ответы [ 4 ]

0 голосов
/ 07 декабря 2018

Если вы рассматриваете Perl .. это всего лишь один лайнер

/tmp> cat thomas.txt
comp-envA-teamA-c9     europe-west4-a
comp-envA-teamA-11b    europe-west4-c
comp-envA-teamB-7r-v6  europe-west4-b
comp-envB-teamB-hx86   europe-west4-a
comp-envB-teamC-lbn7   europe-west4-c
envB-teamC-lcnh        europe-west4-a
/tmp> perl -lane ' /(team.*?)-/; print "\"$F[0]\" is for \"$1\" in zone \"$F[1]\"" ' thomas.txt
"comp-envA-teamA-c9" is for "teamA" in zone "europe-west4-a"
"comp-envA-teamA-11b" is for "teamA" in zone "europe-west4-c"
"comp-envA-teamB-7r-v6" is for "teamB" in zone "europe-west4-b"
"comp-envB-teamB-hx86" is for "teamB" in zone "europe-west4-a"
"comp-envB-teamC-lbn7" is for "teamC" in zone "europe-west4-c"
"envB-teamC-lcnh" is for "teamC" in zone "europe-west4-a"
/tmp>
0 голосов
/ 07 декабря 2018

Если слово team * может находиться где угодно в первой строке, вы можете заблокировать только это слово и разделители [-].

Решение AWK:

awk 'NR>1 { match($1,/team[^- ]+/); print("\"" $1 "\" is for \"" substr($1,RSTART,RLENGTH) "\" in zone \"" $2 "\""); }'

Тест:

$ awk 'NR>1 { match($1,/team[^- ]+/); print("\"" $1 "\" is for \"" substr($1,RSTART,RLENGTH) "\" in zone \"" $2 "\""); }' teams.txt
"gke-envA-teamA-c9" is for "teamA" in zone "europe-west4-a"
"gke-envA-teamA-11b" is for "teamA" in zone "europe-west4-c"
"gke-envA-teamB-7r-v6" is for "teamB" in zone "europe-west4-b"
"gke-envB-teamB-hx86" is for "teamB" in zone "europe-west4-a"
"gke-envB-teamC-lbn7" is for "teamC" in zone "europe-west4-c"
"envB-teamC-lcnh" is for "teamC" in zone "europe-west4-a"
0 голосов
/ 07 декабря 2018
$ cat tst.awk
BEGIN { ofmt = "\"%s\" is for \"%s\" in zone \"%s\"\n" }
NR>1 {
    n = split($1,t,/-/)
    printf ofmt, $1, t[(n>3?3:2)], $2
}

$ awk -f tst.awk file
"comp-envA-teamA-c9" is for "teamA" in zone "europe-west4-a"
"comp-envA-teamA-11b" is for "teamA" in zone "europe-west4-c"
"comp-envA-teamB-7r-v6" is for "teamB" in zone "europe-west4-b"
"comp-envB-teamB-hx86" is for "teamB" in zone "europe-west4-a"
"comp-envB-teamC-lbn7" is for "teamC" in zone "europe-west4-c"
"envB-teamC-lcnh" is for "teamC" in zone "europe-west4-a"
0 голосов
/ 07 декабря 2018
awk '
    function wrap_quotes(str){
        return "\""str"\""
    } 
    NR>1{
        split($1,name_infos,"-");
        print wrap_quotes($1) " is for " wrap_quotes(name_infos[length(name_infos) - 1]) " in zone " wrap_quotes($2)
    }' filename

Возвращает

"comp-envA-teamA-c9" is for "teamA" in zone "europe-west4-a"
"comp-envA-teamA-11b" is for "teamA" in zone "europe-west4-c"
"comp-envA-teamB-7r-v6" is for "7r" in zone "europe-west4-b"
"comp-envB-teamB-hx86" is for "teamB" in zone "europe-west4-a"
"comp-envB-teamC-lbn7" is for "teamC" in zone "europe-west4-c"
"envB-teamC-lcnh" is for "teamC" in zone "europe-west4-a"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...