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

由於您已經在使用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

相關內容