Shell-Script

Bash 循環遍歷兩組文件

  • July 8, 2021

我正在嘗試編寫一個可以遍歷兩個文件夾並將文件執行到 python 程序中的 bash 腳本。python 程序接受兩個輸入文件(每個文件夾中的相應文件)並輸出一個文件。

它看起來有點像這樣:

folder 1/
   Run_1.out
   Run_2.out
   Run_3.out
   ...
folder 2/
   Sym_1.g0.out
   Sym_2.g0.out
   Sym_3.g0.out
   ...

python 程序接受相應的輸入(例如Run_1.outSym_1.g0.out)並輸出一個文件,如下所示:

   NOCI.py Run_1.out Sym_1.g0.out outputfile

當通過終端使用一對文件時,python 程序執行良好,但由於我有 360 對文件,我認為我應該使用腳本。到目前為止,我已經嘗試編寫兩個 for 循環,但它似乎不起作用:

   #!/bin/bash
   FILE1=*.out
   FILE2=*.g0.out
   for i in $FILE1
   do
       for j in $FILE2
           do
               NOCI.py $i $j ${i}_${outputfile}
       done
   done

匹配360folder 1/Run_1.outfolder 2/Sym_1.g0.out,依此類推:

for n in {1..360}
do
   NOCI.py "folder 1/Run_$n.out" "folder 2/Sym_$n.g0.out" outputfile
done

或者,如果配對的文件不是按順序排列的,您可以選擇Run_N.out文件並關聯相應的Sym_N.g0.out文件:

for r in "folder 1/Run_"*.out
do
   n="${r#folder 1/Run_}"; n="${n%.out}"
   s="folder 2/Sym_$n.out"
   NOCI.py "$r" "$s" outputfile
done

zsh會比bash這種任務更適合:

#! /bin/zsh -
files1=(1/*.out(n)) files2=(2/*.go.out(n))
for f1 f2 (${files1:^files2}) NOCI.py $f1 $f2 3/$f1:t:r+$f2:t
  • (n)以數字方式對 glob 進行排序,以便按數字順序處理它們(在哪裡Run_10出現,Run_9Run_11不是在Run_1Run_2沒有它之間)。
  • ${array1:^array2}: 壓縮兩個數組
  • $file:t: 文件的尾部(基本名稱)
  • $filr:r:根部分(刪除副檔名)。

所以我們最終執行:

NOCI.py 1/Run_1.out 2/Sym_1.g0.out 3/Run_1+Sym_1.g0.out
NOCI.py 1/Run_2.out 2/Sym_2.g0.out 3/Run_2+Sym_2.g0.out
...

引用自:https://unix.stackexchange.com/questions/467591