Usando o AWK: Se o valor existir, atribua à variável

0

Realmente sinto muito que isso tenha sido perguntado antes, já que parece básico, eu não estou apenas conectando os pontos e isso está me fazendo arrancar meu cabelo!

Essencialmente eu tenho um arquivo de texto, e estou atribuindo o segundo campo de linhas particulares a uma variável, ou seja,

VAR=$(awk 'NR==1 {print $2}' entry.txt)

No entanto, às vezes na primeira linha do arquivo de texto, ele terá quatro campos. Eu gostaria de dizer

   If ROW 1 has 4 fields  
        VAR = $2, $3 & $4 concatenated
   Else
        VAR = $2 

Tenho certeza de que este é o awk básico, estou apenas fazendo um pequeno projeto e nunca o usei antes. Eu sei que deveria ler um livro, mas este é realmente um pequeno roteiro!

Obrigado

    
por Harry S 20.04.2018 / 17:48

3 respostas

1
awk 'NF == 4 { print $2 $3 $4; exit } { print $2; exit }' file

Isso concatena o segundo, terceiro e quarto campos se houver exatamente quatro campos delimitados por espaço em branco na primeira linha do arquivo. Caso contrário, retornará o segundo campo da primeira linha do arquivo. O programa sai assim que sai qualquer coisa, então estamos certos de que é apenas a primeira linha que veremos.

Com lógica diferente:

awk 'NF == 4 { out = $2 $3 $4 } NF != 4 { out = $4 } { print out; exit }' file

Qualquer um desses comandos entra na sua substituição de comandos:

var=$( awk ... )
    
por 20.04.2018 / 17:52
0
awk 'NR==1 && NF==4 { var=$2 $3 $4 } NR==1 && NF!=4 { var=$2 }' /path/to/input
    
por 20.04.2018 / 17:52
0

Você pode fazer

awk '{$1=""; print (NF==4)?$0:$2; exit}' OFS= infile

O operador da condição Ternary (NF==4)?$0:$2 verifica se os campos N umber de F eram iguais a 4 (quando os campos são separados por espaços em branco ( awk padrão FS )), em seguida, imprimir a linha inteira $0 depois de tirar o primeiro campo $1="" else : print arquivado # 2 $2 .

    
por 20.04.2018 / 17:52

Tags