2013-10-15 117 views
2

我剛開始學習使用命令行。希望這不是一個轉儲問題。按順序連接文件Linux命令

我在我的目錄下面的文件:

L001_R1_001.fastq 
L002_R2_001.fastq 
L004_R1_001.fastq 
L005_R2_001.fastq 
L001_R2_001.fastq 
L003_R1_001.fastq 
L004_R2_001.fastq 
L006_R1_001.fastq 
L002_R1_001.fastq 
L003_R2_001.fastq 
L005_R1_001.fastq 
L006_R2_001.fastq 

您可以在文件名中看到,它的R1和R2和L00後的數字的組合進行排序。

我想按文件名的順序連接文件,分別爲R1和R2文件。

如果我做手工,它看起來像下面這樣:

# for R1 files 
cat L001_R1_001.fastq L002_R1_001.fastq L003_R1_001.fastq L004_R1_001.fastq L005_R1_001.fastq L006_R1_001.fastq > R1.fastq 


# for R2 files 
cat L001_R2_001.fastq L002_R2_001.fastq L003_R2_001.fastq L004_R2_001.fastq L005_R2_001.fastq L006_R2_001.fastq > R2.fastq 

能否請你幫我寫一個腳本,我以後可以再利用? 謝謝!因爲ls按名稱排序中的文件,不需要在大多數系統

+0

嗯作爲sugested,你的shell的'glob'秩序?因爲你可以使用'cat * _R1 _ *。fastq> R1.fastq'然後... – Wrikken

回答

4
cat `ls -- *_R1_*.fastq | sort` >R1.fastq 
cat `ls -- *_R2_*.fastq | sort` >R2.fastq 

| sort

如果文件名包含空格,那麼這樣做第一:

IFS=' 
' 
+3

我相信'ls'和'sort'的使用是多餘的 – jkshah

+0

sort會對輸入進行排序。請考慮使用_ls -1_。此外,執行版本排序可能是一個好主意:_sort -V_ – devnull

+0

* -1 *對於ls是冗餘的,ls在寫入管道時每行寫入一個文件名。 – pts

1

嘗試使用通配符*。它會按字母順序自動擴展文件名。

cat L*_R1_001.fastq > R1.fastq 
cat L*_R2_001.fastq > R2.fastq 

編輯

如果上面的命令沒有給出所需的排序,試圖重寫使用LC_ALL=C區域設置由Fredrik Pihl

LC_ALL=C cat L*_R1_001.fastq > R1.fastq 
+0

也許暗示使用'LC_ALL = C貓L * _R1_001.fastq> R1.fastq'因爲不同的語言區域不會發生有趣的事情 –

+0

@FredrikPihl感謝您的反饋。我已經在ans上添加了你的建議。 – jkshah

+0

不能保證'*'對文件名進行排序。使用'ls'。 – pts