Salve o AWN FNR como uma variável de Bash para continuar a busca na linha

1

Estou tentando executar isso em um arquivo classificado. Isso retorna a última linha que é menor ou igual ao valor fornecido, comparando os primeiros 9 caracteres.

Isso seria feito várias vezes e VALUE seria atribuído em cada execução e eu teria que continuar a pesquisa na linha após a qual minha solução anterior foi encontrada. Eu sei FNR me dá o número da linha atual, mas não foi capaz de salvá-lo como uma variável BASH para manipulação.

Meu file é assim:

093051721DABCD
093052654EEFGH
093053087TIJKL

$ VALUE=093052054;
$ cat file | awk '{if((substr($0,0,9) <= $VALUE)){print $0} else exit}' | tail -1
093051721DABCD

Existe outra maneira de fazer isso?

    
por 1ne 19.11.2014 / 00:07

2 respostas

2
VALUE=083551726
awk -v CMPVALUE="$VALUE" '{linevalue=substr($0,0,9)+0; CMPVALUE=CMPVALUE+0;
  if(linevalue > CMPVALUE) exit; lineno=FNR};
  END {if (lineno>0) print lineno " " $0;
  else print "0 ";}' file
0 

VALUE=083551726555
awk -v CMPVALUE="$VALUE" '{linevalue=substr($0,0,9)+0; CMPVALUE=CMPVALUE+0;
  if(linevalue > CMPVALUE) exit; lineno=FNR};
  END {if (lineno>0) print lineno " " $0;
  else print "0 ";}' file
3 093053087TIJKL
    
por 19.11.2014 / 00:40
0

Considere este bash versão:

#! /bin/bash
exec 3<test.txt
COUNT=0
while read VALUE
do
    if [[ -z $LAST_VAL ]]
    then
        IN_VAL="$LAST_VAL"
    else
        LINE="$(head <&3 -1)"
        IN_VAL="$(cut -c1-9 <<<'$LINE')"
        let COUNT=$COUNT+1
    fi

    while [[ $IN_VAL < $VALUE ]]
    do
        LINE="$(head <&3 -1)"
        IN_VAL="$(cut -c1-9 <<<'$LINE')"
        let COUNT=$COUNT+1
        LAST_VAL="$IN_VAL"
        [[ -z $IN_VAL ]] && break
    done
    echo $((COUNT - 1)) $LINE
    [[ -z $IN_VAL ]] && break
done

head (e algumas outras ferramentas, como grep com --max-count ), diferente de awk , deixa o fluxo posicionado logo após o último caractere lido, para que você possa continuar usando o mesmo fluxo para pesquisar mais tarde. O problema é quando o valor lido não corresponde, então você precisa salvá-lo para a próxima iteração (como eu fiz em LAST_VAL ). Os valores de COUNT e LINE devem ser o último número de linha e linha correspondentes. Dessa forma, tudo isso pode ser feito em uma única leitura do arquivo.

    
por 19.11.2014 / 01:20

Tags