Io-Redirection

如何使用 unix 命令在不同文件夾中合併多個具有相似名稱的文件?

  • February 14, 2018

我知道這個問題之前已經被問過和回答過,我已經嘗試過程式碼,但我沒有得到正確的輸出。

我有 2 個文件夾:vanila1 和 vanila2,每個文件夾都有 400 個名稱相似的文件

ls vanila1
MB.2613.007_0021.ED4_KS1A29-7_338_all
MB.2613.007_0022.ED9_SD2A27-1_180_all
MB.2613.007_14.ED14_IA2A35-2_310_all

ls vanila2
MB.2613.007_0021.ED4_KS1A29-7_338_all
MB.2613.007_0022.ED9_SD2A27-1_180_all
MB.2613.007_14.ED14_IA2A35-2_310_all

我想合併具有相同名稱的文件,我正在使用這個:

ls vanila1 | while read FILE; do
 cat vanila1/"$FILE" vanila2/"$FILE" >> all_combined/"$FILE"
done

我沒有得到正確的輸出,組合文件中的行數比文件 1 和文件 2 的總和多。我做錯了什麼嗎?

我有一種預感,您可能已經多次執行循環,並且由於您使用附加>>數據的重定向運算符,因此您的結果文件每次都會增長。

相反(這裡我ls也避免使用,請參閱“ Why not parse ls? ”中的討論,原因是):

for name in vanila1/*; do
   base_name=${name##*/}

   if [ -f "vanila2/$base_name" ]; then
       cat "$name" "vanila2/$base_name" >"all_combined/$base_name"
   else
       printf 'No file in vanila2 corresponds to "%s"\n' "$name" >&2
   fi
done

變數替換${name##*/}將路徑名之類的vanila1/MB.2613.007_0021.ED4_KS1A29-7_338_all轉換為just MB.2613.007_0021.ED4_KS1A29-7_338_all,即它刪除了之前的所有內容/,包括斜杠(這是路徑名的文件名組成部分,或“基本名”)。這可以替換為$(basename "$name").

vanila2如果從 中提取的名稱對應的文件中有一個文件vanila1,則將兩者連接並放入all_combined目錄中。如果不是,則有關於此事實的診斷消息。

通過使用>而不是>>,任何現有all_combined的同名文件都將被替換而不是附加到。


如果您在 中還有其他文件或目錄vanila1,那麼您可能希望vanila1/*將循環中的模式修改為僅與您感興趣的文件匹配的內容,例如vanila1/*_all或類似文件。

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