2017-07-15 21 views
1

**這裏似乎有部分答案,但用戶遇到了我所做的同樣的問題:保留原始命名方案很重要。使用特定命名方案(UBUNTU)連接文件對

Loop to concatenate multiple pairs of files with almost the same name in UNIX **

我有成對的文件的文件夾;名稱如下所示(全部存儲在同一文件夾/目錄中):

MX_HF20.1.fq.gz; MX_HF20.rem.1.fq.gz

MX_HF22.1.fq.gz; MX_HF22.rem.1.fq.gz

SD_F296.1.fq.gz; SD_F296.rem.1.fq.gz

SD_F297.1.fq.gz; SD_F297.rem.1.fq.gz

(有些人可能認識到這是堆棧輸出!)

真的,我只是希望追加* .1.rem.fq的內容.gz文件保存到* .1.fq.gz文件的末尾,保留原始的* .1.fq.gz文件名。

我已經玩弄過測試文件,所以我知道即使文件是.gz,cat也會這樣做。但我的bash腳本功能最差,工作和存儲名稱變量是一個我仍然很難理解的概念。

非常感謝!

回答

1

也許嘗試使用bash複賽:

#!/bin/bash 

p='([A-Z]+_[A-Z]+)([0-9]+)\.1\.rem\.fq\.gz' 

for f in *.gz; do 
    if [[ $f =~ $p ]]; then 
     cat "${f}" >> "${BASH_REMATCH[1]}${BASH_REMATCH[2]}.1.fq.gz" 
    fi 
done 

因此,例如:

SD_F297.1.rem.fq.gz將被追加到SD_F297.1.fq.gz

+0

感謝您的回覆!我試過了,腳本沒有錯誤地運行,但它似乎並沒有改變任何一個文件(我已經制作了更小,更簡單的文本文件(gzip),其名稱與上面相同)。 我嘗試將* .txt項改爲* .fq.gz,結果相同。有沒有我在那裏失蹤的東西?也許劇本沒有找到任何操作。 – canfiese

+0

@canfiese:它應該工作,我很驚訝它沒有。也許試着在「貓」前面加上「回聲」來看看會發生什麼。回聲不會改變文件,但應該告訴你可能發生的事情。 –

+0

我很抱歉,我是個白癡。上面的命名方案不正確。它應該是* .rem.1.fq.gz。我切換它,它做了一些事情......但它使我的測試文件175 MB(從16個字節),它不會打開。這很奇怪,但我以前見過。必須是.gz的特性... – canfiese

0

這聽起來像你正在尋找的東西是這樣的:

#!/bin/bash 
for file1 in *.1.fq.gz; do 
    file2=`echo $file1 | sed -E 's/(*\.1)\.fq\.gz/\1.rem.fq.gz/'` 
    cat $file1 $file2 > out.$file1 
done 

Backquotes執行shel -l命令,並在腳本中插入文本的結果到這一點

的sed是在UNIX流編輯器,操縱文本

它使用正則表達式的線條,在這種情況下,你需要()來組和捕獲文件名的第一部分和\ 1來引用它

+0

(編輯)@ zakum1謝謝!這看起來確實是在正確的軌道上(從我的經驗來看)。但我得到以下錯誤: sed:-e表達式#1,字符30:無效的前面的正則表達式 – canfiese

+0

此外,它可能會有所作爲...但我確實必須編輯我的文件名系統。它是* .rem.1.fq.gz雞蛋滿臉。抱歉。 :/ – canfiese