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 awk
vez de um shell loop (chamar awk
um 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 awk
todos os seus .b
arquivos 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 awk
que 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 nextfile
apó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
nextfile
também é suportado por mawk
.
Responder2
Experimente isso
awk 'FNR==2 {print ("python2 script.py " FILENAME " 1 5.732436 " $1 " f" FILENAME " n")}' *.b