bash 中的打印循环

bash 中的打印循环

请问如何在 bash 中打印这个?

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

我想打印字符串“python2 script.py”、文件名、变量a的字符串“1 5.732436”值、文件名和前面的f以及字符串n。

所需的输出(对于包含文件的目录:file1.b、file2.b、file3.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

答案1

由于您已经在使用awk,请使用awk而不是在 shell 循环中执行此操作(awk在这样的循环中调用很慢且不必要):

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

这会将awk您的所有.b文件作为输入进行调用。对于每个文件的第二行,它将把所需的输出打印到标准输出,从当前输入文件的第一个字段获取数据。

FILENAME是一个特殊变量,awk其中包含当前输入文件的名称。同样,FNR是当前文件中的当前记录号(行号)。

如果您使用 GNU (可能在 Linux 系统上)并且您的文件非常大,您可以通过在打印后awk调用来加快速度。nextfile这将立即跳到下一个输入文件,而不从当前文件中读取更多内容。

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

nextfile也得到支持mawk

答案2

尝试这个

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

相关内容