operação de parâmetro dentro da linha awk

1

Quando executo bjobs -w na máquina em que trabalho, recebo a próxima saída:

JOBID   USER  STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME SUBMIT_TIME
821213  user1 RUN   parallel16 hpc2        16*pirineus NAME1111 Apr 9 20:26
823954  user1 RUN   parallel16 hpc1        5*pirineus4 NAME2222 Apr 11 22:45
824083  user1 RUN   parallel16 hpc1        16*collserola2 otherthing Apr 12 19:20
824297  user1 RUN   parallel16 hpc1        8*collserola10 another_long_name Apr 13 20:50
824305  user1 RUN   parallel16 hpc2        16*collserola5 Try_anothername Apr 14 12:16

Depois, quero obter as informações da primeira e da sexta coluna. Para isso, eu pensei que poderia fazer isso assim

bjobs |awk '(NR>=2) {print $1 " "$6 }'

mas, estou recebendo

821213 16*pirineus
823954 5*pirineus
824083 16*collsero
824297 8*collsero
824305 16*collsero

quando eu gostaria de obter

821213 pirineus
823954 pirineus4
824083 collsero2
824297 collsero10
824305 collsero5

Eu tentei o próximo comando (seguindo a ideia de usar operações de parâmetro), mas isso me deu um erro.

bjobs |awk '(NR>=2) {print $1" " ${6#* *} }'

awk: (NR>=2) {print $1" " ${6#* *} }
awk:                       ^ syntax error
awk: línea ord.:1: (NR>=2) {print $1" " ${6#* *} }
awk: línea ord.:1:                         ^ syntax error

Alguma idéia de como posso resolver isso?

    
por Seven77 14.04.2018 / 22:25

2 respostas

3

Você não pode usar a substituição de parâmetro do shell dentro de um programa awk .

Para remover o primeiro bit da sexta coluna, use sub() :

bjobs -w | awk 'NR > 1 { sub("^[^*]*[*]", "", $6); print $1, $6 }'

Isso modificaria o sexto campo removendo o bit até o * antes de imprimi-lo. A expressão regular ^[^*]*[*] corresponde a qualquer número de caracteres que não sejam * no início da cadeia e, em seguida, * . Isso é então substituído pela string vazia.

O acima transforma a saída da pergunta em

821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5

NOTA: Todas as variações abaixo (incluindo a sed solution) assumem que existe um * no sexto campo . O acima funcionaria mesmo se não houvesse.

Outra maneira de fazer isso é dividir o sexto campo no * e imprimir a segunda parte:

bjobs -w | awk 'NR > 1 { split($6, a, "[*]"); print $1, a[2] }'

Uma terceira maneira de fazer isso é usar os dois espaços em branco e * como o delimitador de campo (observe a alteração no número do campo):

bjobs -w | awk -F "[[:blank:]*]+" 'NR > 1 { print $1, $7 }'

Usando sed :

bjobs -w | sed -nE 's/^([[:alnum:]]+).*\*([[:alnum:]]+).*/ /p'
    
por 14.04.2018 / 22:33
0

Eu usei o comando abaixo para obter o resultado desejado

awk 'NR >=2{print $1,$6}' example.txt  | sed "s/[0-9]\{1,2\}\*//g"

saída

821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5
    
por 15.04.2018 / 07:22