2013-10-15 69 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