Io-Redirection
如何使用 unix 命令在不同文件夾中合併多個具有相似名稱的文件?
我知道這個問題之前已經被問過和回答過,我已經嘗試過程式碼,但我沒有得到正確的輸出。
我有 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 parsels
? ”中的討論,原因是):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
轉換為justMB.2613.007_0021.ED4_KS1A29-7_338_all
,即它刪除了之前的所有內容/
,包括斜杠(這是路徑名的文件名組成部分,或“基本名”)。這可以替換為$(basename "$name")
.
vanila2
如果從 中提取的名稱對應的文件中有一個文件vanila1
,則將兩者連接並放入all_combined
目錄中。如果不是,則有關於此事實的診斷消息。通過使用
>
而不是>>
,任何現有all_combined
的同名文件都將被替換而不是附加到。如果您在 中還有其他文件或目錄
vanila1
,那麼您可能希望vanila1/*
將循環中的模式修改為僅與您感興趣的文件匹配的內容,例如vanila1/*_all
或類似文件。