我正在使用这些文件进行测试:
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
最后,正如我所说,这是一个小测试。我希望我的脚本能够处理许多具有相同特征的文件。
答案 0 :(得分:1)
使用awk
:
ls -1 *.fastq | awk -F_ '$8 == "R1" {system("cat " $0 ">>" $1 "_R1.out")}'
将所有文件*.fastq
列入awk
,并在_
上拆分。检查第8部分$8
是R1
,然后将cat >>
文件追加到第一部分$1
+ _R1.out
,这将是comp900_R1.out
或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
答案 1 :(得分: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
)来提取代码。