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
すでにthisを使用しているので、awk
シェルawk
ループでこれを行うのではなく(awk
このようなループ呼び出しは遅くて不要です):
awk 'FNR == 2 {
printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
}' *.b
これによりawk
、すべてのファイルが入力として.b
呼び出されます。各ファイルの2行目では、目的の出力を標準出力として印刷し、現在の入力ファイルの最初のフィールドからデータを取得します。
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