これを 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'、ファイル名、文字列 '1 5.732436'、変数 a の値、ファイル名、先頭の 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
シェル ループではなく を使用してこれを実行します (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 awk
(おそらく Linux システム) を使用していて、ファイルが非常に大きい場合は、nextfile
after printing を呼び出すことで、処理を少し高速化できます。これにより、現在のファイルからさらに読み取ることなく、すぐに次の入力ファイルにスキップします。
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