【问题标题】:Concatenate Files In Order Linux Command按顺序连接文件 Linux 命令
【发布时间】:2013-10-23 16:41:42
【问题描述】:

我刚开始学习使用命令行。希望这不是一个转储问题。

我的目录中有以下文件:

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

你能帮我写一个我以后可以重复使用的脚本吗? 谢谢!

【问题讨论】:

  • 嗯,你的 shell 的glob 有顺序吗?因为你可以使用cat *_R1_*.fastq > R1.fastq 然后......

标签: linux sorting cat fastq


【解决方案1】:
cat `ls -- *_R1_*.fastq | sort` >R1.fastq
cat `ls -- *_R2_*.fastq | sort` >R2.fastq

大多数系统不需要| sort,因为ls 按名称对文件进行排序。

如果文件名中包含空格,则先这样做:

IFS='
'

【讨论】:

  • 我认为使用lssort 是多余的
  • sort 将对输入的 进行排序。考虑改用 ls -1。此外,执行版本排序可能是个好主意:sort -V
  • -1 for ls 是多余的,ls 在写入管道时每行写入一个文件名。
【解决方案2】:

尝试使用通配符*。它将按字母顺序自动扩展文件名。

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

【讨论】:

  • 可能提示使用LC_ALL=C cat L*_R1_001.fastq > R1.fastq,所以由于语言环境不同而不会发生有趣的事情
  • @FredrikPihl 感谢您的反馈。我在ans中添加了你的建议。
  • 不能保证* 对文件名进行排序。为此使用ls
  • @Fredrik Pihl: LC_ALL=C* 中的排序和匹配没有影响,因为shell 在应用环境变量更改之前扩展*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2019-11-06
  • 2012-03-25
相关资源
最近更新 更多