Como continuar com a próxima iteração em bash [closed]

-1

Eu tenho um diretório no qual existem 10k arquivos e dentro do arquivo na terceira linha eu tenho um ID. Meu script mostrará o código como:

for file in *;do
    if [[ -f $file ]];then
         rid=cat $filename | head -3 $filename | awk '{print $3}'
         echo $rid
     else
        echo $file "not found"
     fi

Se estiver faltando, deve prosseguir com o próximo arquivo que não está acontecendo e ficar preso. Com menos número de arquivos, funciona bem. Como resolver?

    
por Anony 18.10.2017 / 06:19

2 respostas

1

Assumindo que o trecho de código faz parte de um prompt de linha de comando / script bash. Um loop for tem a forma geral como.

for arg in [list]
  do
   command(s)...
done

Não tendo a parte done do loop for resulta.

syntax error: unexpected end of file

Ainda mais nomes de variáveis devem ser consistentes. file e filename parecem ser usados de forma intercambiável. É aconselhável citar variáveis para evitar o spiting de palavras. A variável $filename usada na terceira linha do snippet de código é não inicializada, isto é, vazia. Isso resulta em head -3 '' sendo executado fornecendo os resultados head: cannot open '' for reading: No such file or directory no mínimo 10k vezes.

Além disso, cat $filename | head -3 $filename é adicionado de forma redundante à carga de trabalho para fins aparentemente inúteis.

Corrigindo todos esses problemas, produzimos.

for file in *;do
    if [[ -f "$file" ]];then
         rid="$(head -3 "$file" | awk '{print $3}')"
         echo "$rid"
     else
        echo "$file" " not found"
     fi
done

ou como um forro

for file in *;do if [[ -f "$file" ]];then rid="$(head -3 "$file" | awk '{print $3}')"; echo "$rid"; else echo "$file" " not found"; fi;done

O programa shellcheck é bastante útil para encontrar essas pegadinhas antes de executar o código. O Shellcheck está disponível no repositório do universo.

Para ler mais, consulte o Guia Avançado de Roteiro de Bash de Mendel Cooper

    
por J. Starnes 18.10.2017 / 07:11
1

Por seu script você não está grep do ID que você está falando nem você está checando se está saindo ou não! Você está apenas imprimindo o valor da terceira linha da coluna rd (se você quer dizer com grep está ficando / imprimindo ) se ID estiver lá ou não).

Abaixo, o comando awk está verificando ID se ele sai em cada arquivo na terceira linha, depois imprime o valor da coluna 3 rd ; Caso contrário, se isso não existir, imprima "Not Fouund" e leia nextfile .

awk 'FNR==3&& !/ID/{print "Not Found"; nextfile} FNR==3 && /ID/{print $3}' file*

Em man awk

nextfile   Stop  processing the current input file.  The next input record read comes from the next
           input file.  FILENAME and ARGIND are updated, FNR is reset to 1, and  processing  starts
           over  with  the  first  pattern  in the AWK program.  Upon reaching the end of the input
           data, gawk executes any END rule(s).
    
por devWeek 18.10.2017 / 07:38