请问如何在 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