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

すでに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行目では、目的の出力を標準出力として印刷し、現在の入力ファイルの最初のフィールドからデータを取得します。

FILENAMEawk現在の入力ファイルの名前を含む特殊変数です。今回も、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

関連情報