Ciclo de impressão no bash

Ciclo de impressão no bash

Como imprimir isso no bash, por favor?

for file in *.b; do
  a="$(awk 'NR==2{print $1}' "$file")"
  printf ('python2 script.py' $file '1 5.732436' $a "f$file" 'n')
done

Gostaria de imprimir a string 'python2 script.py', nome do arquivo, strings '1 5.732436' valor da variável a, nome do arquivo ef na frente e string n.

A saída desejada (para diretório com arquivos: arquivo1.b, arquivo2.b, arquivo3.b:

python2 script.py file1.b 1 5.732436 5.5 ffile1.b n
python2 script.py file2.b 1 5.732436 3.2 ffile2.b n
python2 script.py file3.b 1 5.732436 1.2 ffile3.b n

Responder1

Como você já está usando awk, faça isso em awkvez de um shell loop (chamar awkum loop como esse é lento e desnecessário):

awk 'FNR == 2 { 
    printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
}' *.b

Isso chama awktodos os seus .barquivos como entrada. Para a linha dois de cada arquivo, ele imprimirá a saída desejada na saída padrão, retirando os dados do primeiro campo do arquivo de entrada atual.

FILENAMEé uma variável especial awkque contém o nome do arquivo de entrada atual. Da mesma forma, FNRé o número do registro atual (número da linha) no arquivo atual.

Se você estiver usando GNU awk(provavelmente em um sistema Linux) e seus arquivos forem muito grandes, você pode acelerar um pouco as coisas chamando nextfileapós a impressão. Isso pularia imediatamente para o próximo arquivo de entrada, sem ler mais do arquivo atual.

awk 'FNR == 2 { 
    printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
    nextfile
}' *.b

nextfiletambém é suportado por mawk.

Responder2

Experimente isso

awk 'FNR==2 {print ("python2 script.py " FILENAME " 1 5.732436 " $1 " f" FILENAME " n")}' *.b

informação relacionada