0

我正在使用这些文件进行测试:

comp900_c0_seq1_Glicose_1_ACTTGA_merge_R1_001.fastq
comp900_c0_seq1_Glicose_1_ACTTGA_merge_R2_001.fastq
comp900_c0_seq2_Glicose_1_ACTTGA_merge_R1_001.fastq
comp900_c0_seq2_Glicose_1_ACTTGA_merge_R2_001.fastq
comp995_c0_seq1_Glicose_1_ACTTGA_merge_R2_001.fastq
comp995_c0_seq1_Xilano_1_AGTCAA_merge_R1_001.fastq
comp995_c0_seq1_Xilano_1_AGTCAA_merge_R2_001.fastq

我想获取在第一个 _ (下划线)之前具有相同代码的文件,并将代码 R1 放在不同的输出文件中。应根据代码调用输出文件,直到第一个 _(下划线)。

- 这是我的代码,但我在制作输出文件时遇到了麻烦。

#!/bin/bash

for i in {900..995}; do
    if [[ ${i} -eq ${i} ]]; then
        cat comp${i}_*_R1_001.fastq
    fi
done

- 我想要两个输出:

一个输出将包含以下所有行:

comp900_c0_seq1_Glicose_1_ACTTGA_merge_R1_001.fastq
comp900_c0_seq2_Glicose_1_ACTTGA_merge_R1_001.fastq

它的名字应该是comp900_R1.out

另一个输出将包含以下行:

comp995_c0_seq1_Xilano_1_AGTCAA_merge_R1_001.fastq

它的名字应该是comp995_R1.out

最后,正如我所说,这是一个小测试。我希望我的脚本可以处理许多具有相同特征的文件。

4

2 回答 2

1

我对一般解决方案的尝试:

#!/bin/bash

for f in *_R1_*; do
   code=$(echo $f | cut -d _ -f 1)
   cat $f >> ${code}_c0_seq1_Glicose_1_ACTTGA_merge_R1_001.fastq
done

迭代其中包含的文件_R1_,然后将其输出附加到基于code.

cut-d _通过拆分文件名 ( ) 并返回第一个字段 ( )来提取代码-f 1

于 2014-02-05T17:02:15.113 回答
1

使用awk

ls -1 *.fastq | awk -F_ '$8 == "R1" {system("cat " $0 ">>" $1 "_R1.out")}'

将所有文件列出*.fastqawk中,然后拆分_。检查 8:th 部分$8是否为R1,然后将文件附加cat >>到第一部分$1+ _R1.out,这将是comp900_R1.outor comp995_R1.out。假定没有文件名包含空格或其他特殊字符。

结果:

comp900_R1.out包含所有行的文件

comp900_c0_seq1_Glicose_1_ACTTGA_merge_R1_001.fastq
comp900_c0_seq2_Glicose_1_ACTTGA_merge_R1_001.fastq

comp995_R1.out包含所有行的文件

comp995_c0_seq1_Xilano_1_AGTCAA_merge_R1_001.fastq
于 2014-02-05T16:57:47.250 回答