【问题标题】:catting together different files in unix将unix中的不同文件组合在一起
【发布时间】:2016-04-29 18:50:25
【问题描述】:

我有一个文件夹,里面有一堆文件,我想把特定的文件放在一起。布局是这样的:

sample1_S99_L1_R1_001.fastq.gz
sample1_S99_L2_R1_001.fastq.gz

sample1_S99_L1_R2_001.fastq.gz
sample1_S99_L2_R2_001.fastq.gz

sample2_S88_L1_R1_001.fastq.gz
sample2_S88_L2_R1_001.fastq.gz

sample2_S88_L1_R2_001.fastq.gz
sample2_S88_L2_R2_001.fastq.gz

针对不同的样本等等。 我想将 sample1_S99_*_R1_001.fastq.gz 放入 1 个 gunzip 文件中。所以上面代码中分组的样本应该放在一起。

我会手动做这样的事情:

cat sample1_S99_L1_R1_001.fastq.gz sample1_S99_L2_R1_001.fastq.gz > sample1.R1.fastq.gz

cat sample1_S99_L1_R2_001.fastq.gz sample1_S99_L2_R2_001.fastq.gz > sample1.R2.fastq.gz

我的想法是自动化这个过程,我想出了这个:

ls | awk -F '[_.]' '{print $1}' > test.txt
sort -u test.txt > names_final.txt
while read line;do cat $line_*_*_R1_*.fastq.gz > $line.R1.fastq.gz;done < names_final.txt
while read line;do cat $line_*_*_R2_*.fastq.gz > $line.R2.fastq.gz;done < names_final.txt

我现在面临的问题是这些命令似乎将所有 R1 文件集中在一起。例如,如果我输入

ls sample1_*_*_R1_*.fastq.gz 

我只得到我想要一起分类的文件。所以我不确定我的错误是否在这里。

有人有想法吗?

提前致谢。

【问题讨论】:

  • 所以你希望file_LX_001 块在一起,然后file_LX_002 在一起,等等?例子有点混乱
  • 很抱歉给您带来了困惑。我想将这些具有相同样本名称和相同 R 值的文件放在一起。所以 R1 和 R2。
  • 那么在你刚刚更新的输入中,哪些应该放在一起呢?都是 s99,然后是 s88,等等?
  • 应该在一起的都具有相同的R值,所以R1和R2。所以我提供的示例文件的输出应该是:sample1.R1.fastq.gz sample1.R2.fastq.gz sample2.R1.fastq.gz sample2.R2.fastq.gz
  • 请注意,在$line_*_*_R2_*.fastq.gz 中,这是用尾随下划线替换变量$line_,而不是您想要的$line。下划线是标识符中的有效字符(但破折号不是,因此如果文件名使用破折号而不是下划线,$line-*-*-R2-*.fastq.gz 将起作用)。您可能需要:${line}_*_*_R2_*.fastq.gz,其中大括号分隔变量的名称。

标签: unix cat


【解决方案1】:

$line_*_*_R1_*.fastq.gz 被解析为${line_}*_*_R1_*.fastq.gz,因为下划线是变量名中的有效字符。带有下划线的$line_ 为空,因此由于前导星号,所以 glob *_*_R1_*.fastq.gz 匹配所有样本名称。

使用显式花括号来解决此问题。

while read line;do cat ${line}_*_*_R1_*.fastq.gz > $line.R1.fastq.gz;done < names_final.txt
while read line;do cat ${line}_*_*_R2_*.fastq.gz > $line.R2.fastq.gz;done < names_final.txt

【讨论】:

  • 这似乎已经解决了。谢谢!
【解决方案2】:

我会使用双 for:

for i in {00..99}; do
   for j in 1 2; do
       cat sample1_S${i}_L*_R${j}_001.fastq.gz >> sample1.S$i.R$j.fastq.gz
   done
done

这会遍历所有文件和 cats 以及具有相同 sample1_SXX_RYY 的文件。

注意两点:

  • 您可能需要zcatcat 压缩文件。
  • 使用变量定义名称范围时使用大括号:echo $a_c 尝试回显变量a_c,而echo ${a}_c 回显变量$a,然后回显_c。李>

【讨论】:

  • 可以拼接多个压缩文件。在这种情况下,gunzip 将一次提取所有成员。
  • @JohnKugelman 嗯,很高兴知道。那么几个cat *.gz的结果也是压缩文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2018-07-30
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多