Awk - Imprime linha se o número estiver entre a coluna 1 e a coluna 2

2

Eu tenho um arquivo com dados formatados como este.

Arquivo de entrada

"1930","1946","FOO","BAR","GREEN"
"1949","1962","FOO","BAR","BLUE"
"1970","1980","FOO","BAR","YELLOW"

Os números não são contínuos, com algumas lacunas importantes às vezes. Gostaria de ter a seguinte linha correspondente retornada para um número que corresponda entre as duas primeiras colunas.

Exemplo:

Saída desejada para o Número 1952

1952:
"1949","1962","FOO","BAR","BLUE"

O AWK ou qualquer script do bash serve.

    
por hikari 24.05.2015 / 09:03

4 respostas

3
$ awk -F',' -v y=1952 'BEGIN{print y":"} {line=$0;gsub("\"","");} $1+0<=y && y<=$2+0 {print line}' file
1952:
"1949","1962","FOO","BAR","BLUE"

Como funciona

  • -F','

    Isso define o separador de campo como uma vírgula.

  • -v y=1952

    Isso define uma variável awk y com valor 1952.

  • BEGIN{print y":";}

    Isto imprime a linha de cabeçalho.

  • line=$0; gsub("\"","")

    Isso salva a linha original como line . Em seguida, remove as aspas duplas dos campos.

  • $1+0<=y && y<=$2+0 {print line}

    Se o valor de y estiver entre os valores da primeira e da segunda colunas, imprima o original line .

    Na linha acima, zero é adicionado aos números nas primeiras e segundas colunas. Isso garante que o awk trate essas colunas como números, não como strings e, consequentemente, faça comparações numéricas, não de strings.

por 24.05.2015 / 09:35
2

Com um separador de campo mais específico, uma solução awk compacta poderia ser:

awk -F '(","|^"|"$)' -v d=1952 'd>=$2 && d<=$3'

Notas: Devido ao separador de campos escolhido, os campos $2 e $3 são os respectivos campos. A cotação final ( "$ ) foi adicionada para um caso mais geral de que qualquer linha poderia ter apenas duas datas sem dados adicionais. Cabeçalho é omitido conforme indicado no outro comentário; caso contrário, adicione BEGIN{print d":"} . A parte principal d>=$2 && d<=$3 é auto-explicativa.

    
por 24.05.2015 / 13:57
1

Um menor awk :

$ awk -F\" -vn=1952 '$2<=n && $4>=n' file
"1949","1962","FOO","BAR","BLUE"

Os itens acima funcionarão com a mais moderna awk , baseada em nawk .

Com a implementação derivada do original awk , como oawk , você precisa:

oawk -F\" 'BEGIN{n=1952}$2<=n && $4>=n'
    
por 24.05.2015 / 18:42
0
awk ' y>=nq($1) && y<=nq($2)
      function nq(s) {return gensub(/^"|"$/,"","g",s)}
    ' F=, y=1951 file

Ou, se preferir, você pode colocar as variáveis F abn y imediatamente após awk , em vez de como um parâmetro

awk -F, -vy=1951 
    
por 24.05.2015 / 20:13

Tags