【问题标题】:shell script issue for paired end files name matching [duplicate]配对结束文件名匹配的shell脚本问题[重复]
【发布时间】:2022-01-21 19:57:51
【问题描述】:

我有文件列表,其中每个文件有两组文件正向和反向。

KIMS2021-01_R1.fastq.gz  KIMS2021-05_R2.fastq.gz  SRR1734377_1.fastq.gz  SRR6006898_2.fastq.gz  SRR6006903_1.fastq.gz
KIMS2021-01_R2.fastq.gz  KIMS2021-06_R1.fastq.gz  SRR1734377_2.fastq.gz  SRR6006899_1.fastq.gz  SRR6006903_2.fastq.gz
KIMS2021-02_R1.fastq.gz  KIMS2021-06_R2.fastq.gz  SRR6006895_1.fastq.gz  SRR6006899_2.fastq.gz  SRR6006904_1.fastq.gz
KIMS2021-02_R2.fastq.gz  SRR1734374_1.fastq.gz    SRR6006895_2.fastq.gz  SRR6006900_1.fastq.gz  SRR6006904_2.fastq.gz
KIMS2021-03_R1.fastq.gz  SRR1734374_2.fastq.gz    SRR6006896_1.fastq.gz  SRR6006900_2.fastq.gz  SRR6006905_1.fastq.gz
KIMS2021-03_R2.fastq.gz  SRR1734375_1.fastq.gz    SRR6006896_2.fastq.gz  SRR6006901_1.fastq.gz  SRR6006905_2.fastq.gz
KIMS2021-04_R1.fastq.gz  SRR1734375_2.fastq.gz    SRR6006897_1.fastq.gz  SRR6006901_2.fastq.gz  SRR6006906_1.fastq.gz
KIMS2021-04_R2.fastq.gz  SRR1734376_1.fastq.gz    SRR6006897_2.fastq.gz  SRR6006902_1.fastq.gz  SRR6006906_2.fastq.gz
KIMS2021-05_R1.fastq.gz  SRR1734376_2.fastq.gz    SRR6006898_1.fastq.gz  SRR6006902_2.fastq.gz

我的目标是将这些文件传递给输入,当所有文件都具有相似的命名模式时,这很简单,我有来自两个不同来源的数据..

这是我运行的命令

for i in $(ls *.fastq*.gz | sed 's/00[0-9]\.gz/.gz/' | rev | cut -c 17- | rev | uniq); do STAR --runMode alignReads --outSAMtype BAM SortedByCoordinate --runThreadN 30 --genomeDir /run/media/punit/data3/Santosh_star_index --readFilesIn  <(gunzip -c ${i}_R1_001.fastq.gz ${i}_R2_001.fastq.gz ) --outFileNamePrefix ${i%};done

我的想法是我应该为每个集合获取一个文件名。

此命令适用于以 SRR id 开头的文件,正如我所尝试的那样

for i in $(ls *.fastq*.gz | sed 's/00[0-9]\.gz/.gz/' | rev | cut -c 12- | rev | uniq); do echo $i; done

上面的输出是这样的

KIMS2021-01_
KIMS2021-02_
KIMS2021-03_
KIMS2021-04_
KIMS2021-05_
KIMS2021-06_
SRR1734374
SRR1734375
SRR1734376
SRR1734377
SRR6006895
SRR6006896
SRR6006897
SRR6006898
SRR6006899
SRR6006900
SRR6006901
SRR6006902
SRR6006903
SRR6006904
SRR6006905

在这里我可以看到 SRR id 变得独一无二,而 KIIMS 不是。 所以任何建议或帮助我如何使它们类似的模式运行一次。

天真的方法是将它们作为两个不同的集合运行,而不是一个,但我想学习当有不同种类或不同长度的命名时如何做

更新

此代码执行我想要的统一名称

for i in $(echo *.fastq*.gz); do echo ${i%_*}; done | uniq

现在我想将它与我的其余命令一起使用

 do STAR --runMode alignReads --outSAMtype BAM SortedByCoordinate --runThreadN 30 --genomeDir /run/media/punit/data3/Santosh_star_index --readFilesIn  <(gunzip -c ${i}_R1_001.fastq.gz ${i}_R2_001.fastq.gz ) --outFileNamePrefix ${i%};done

现在我的问题是我有 2 个 do 不起作用,但我如何将名称通过管道传递给命令

【问题讨论】:

  • 您需要从文件名中删除最后一个 _ 及其后面的所有内容。这可以通过${i%_*} 来实现。
  • 愚蠢的问题我将如何实现仅重命名所有文件名?
  • 顺便说一句,这是useless use of ls
  • 使用printf 代替ls 并没有更复杂,更简单,更不容易出错。一般来说,never use ls in scripts.,正是因为所有的并发症。
  • 我不完全确定您的问题到底是什么;如果副本没有回答您的问题,也许可以尝试将edit 这变成一个更清晰、更集中的问题。如果你这样做了,请随时像 @tripleee 一样在此处联系我以重新打开它。

标签: bash shell for-loop


【解决方案1】:

你可以试试这样的

for i in $(echo *.fastq*.gz); do echo ${i%_*}; done | uniq

编辑ls 替换为echo。 @triplee 是对的,这个比较靠谱。

【讨论】:

  • 是的,我做到了,我在我的评论中发布了它,谢谢你给了我一个处理文件的新技巧
  • 很高兴我能帮上忙。
  • for i in $(ls .fastq.gz);做回声 ${i%_*};完成 |独特的; do STAR --runMode alignReads --outSAMtype BAM SortedByCoordinate --runThreadN 30 --genomeDir /run/media/punit/data3/Santosh_star_index --readFilesIn
  • 该部分已排序,但我想将文件传送到实际工具的步骤是我犯了一个错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多