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'、ファイル名、文字列 '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

すでに を使用しているためawkawkシェル ループではなく を使用してこれを実行します (awkこのようなループでの の呼び出しは遅く、不要です)。

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

これは、awkすべての.bファイルを入力として呼び出します。各ファイルの 2 行目では、現在の入力ファイルの最初のフィールドからデータを取得して、必要な出力を標準出力に印刷します。

FILENAMEawkは、現在の入力ファイルの名前を含む内の特別な変数です。同様に、FNRは現在のファイル内の現在のレコード番号 (行番号) です。

GNU awk(おそらく Linux システム) を使用していて、ファイルが非常に大きい場合は、nextfileafter 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

関連情報