como eu poderia passar variável dentro do jogo awk?

1

Eu tenho um comando do awk. Eu preciso usar a variável i , mas meu comando não funciona quando eu faço.

"fechaName": "1","firstName": "gdrgo",   "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John",   "lastName": "222",dfg
"fechaName": "2","xxxxx": "John",    "firstName": "beto",   "xxxxx": "John", "xxxxx": "John", "xxxxx": "John",   "lastName": "111","xxxxx": "John",
"fechaName": "4","xxxxx": "John",    "firstName": "beto",   "xxxxx": "John", "xxxxx": "John", "xxxxx": "John",   "lastName": "111","xxxxx": "John",
"fechaName": "4","xxxxx": "John",   "xxxxx": "John",    "firstName": "beto2", "xxxxx": "John","lastName": "555", "xxxxx": "John","xxxxx": "John",
"fechaName": "5","xxxxx": "John",   "xxxxx": "John",    "firstName": "beto2", "xxxxx": "John","lastName": "444", "xxxxx": "John","xxxxx": "John",
"fechaName": "4","firstName": "gdrgo",   "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John", "xxxxx": "John",   "lastName": "222",dfg
"fechaName": "7","xxxxx": "John",   "xxxxx": "John",    "firstName": "beto2", "xxxxx": "John","lastName": "444", "xxxxx": "John","xxxxx": "John",

Quando uso 5 em vez de "i" , funciona

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /5"/) )  print $0 }'   sumacomando

este é o meu comando

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /**i**"/) )  print $0 }'   sumacomando

awk  -v OFS='"' -v   FS='Name": "'     '{ for( i=2; i<=7; i++ ) if( match($2, /i"/) )  print $0 }'   sumacomando
    
por Alejandro Diego 13.03.2017 / 14:23

2 respostas

0

Você não pode classificar todos os registros com apenas um passe.

Para responder literalmente à sua pergunta principal para corresponder a um campo com uma variável, basta fazer match($2,i) sem /.../ (ou match($2, i "\"") para i seguido de " . Usando a sintaxe normal de concatenação de cadeias) .

Mesmo este lhe trará resultados corretos para um registro contendo "4":

awk '{i=4}$0 ~ "\"" i "\""' file1 #(string concatenation yelds to "4")

Mas este, embora funcione sem erros, não classificará automaticamente os dados com uma única passagem, como você poderia esperar:

awk '{for (i=1;i<8;i++) if ($0 ~ "\"" i "\"") print}' file1

Para classificar todos os registros necessários primeiro para carregar todos os registros na memória e imprimi-los em uma ordem de classificação.

Esta é uma abordagem diferente que funciona com o seu arquivo de amostra:

awk  -F"[\"]" '{a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0;last=NR}END{for (i=1;i<=last;i++) if (a[i]) print a[i]}' file1

Veja o teste on-line aqui

O uso do delimitador " text da primeira linha "fechaName": "1",.... será dividido em 4 partes e 1 (campo $ 4) poderá ser usado diretamente como um número inteiro.

A parte a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0 é apenas um if-then-else:

se a[$4] (== > a[1] para primeira linha) já tiver um valor, adicione essa linha ao conteúdo anterior de [$ 4] usando o ORS (Output Record Separator) que é uma nova linha (ou poderia ser um litteral "\ n") - senão aplicar $ 0 a um [$ 4]

Finalmente, na seção final, apenas imprimimos esta matriz.

Precisamos dizer que esse tipo será muito mais rápido do que o awk para esta operação:

LC_ALL=C sort -t"\"" -k3 file1
    
por 13.03.2017 / 17:17
0

Parece que você quer imprimir as linhas contendo 1 a 7. Isso seria algo como

awk '/"fechaName": "[1-7]"/ { print }'
    
por 13.03.2017 / 14:40