Bash 从fastq文件中的读取对中选择随机读取

Bash 从fastq文件中的读取对中选择随机读取,bash,bioinformatics,fastq,Bash,Bioinformatics,Fastq,我有一个问题,关于随机选择从一对取样的fastq文件中读取的数据。我读了一些关于这种方式的话题,但没有一个能解决我的问题,那就是: 我有两个fastq文件R1.fastq和R2.fastq。我想要实现的是随机采样这些文件,并从每个采样的读取对中随机选择一个读取 到目前为止我所做的是 我使用seqtk对我的文件进行了采样: seqtk sample -s100 R1.fastq 10000 > R1_sample.fastq seqtk sample -s100 R2.fastq 10000

我有一个问题,关于随机选择从一对取样的fastq文件中读取的数据。我读了一些关于这种方式的话题,但没有一个能解决我的问题,那就是: 我有两个fastq文件R1.fastq和R2.fastq。我想要实现的是随机采样这些文件,并从每个采样的读取对中随机选择一个读取

到目前为止我所做的是

我使用seqtk对我的文件进行了采样:

seqtk sample -s100 R1.fastq 10000 > R1_sample.fastq
seqtk sample -s100 R2.fastq 10000 > R2_sample.fastq
然后我按顺序ID对每个文件进行排序,如下所示:

paste - - - - < R1_sample.fastq | sort -k1 -t " " | tr "\t" "\n" > R1_sample_sorted.fastq
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000
TGATGTTTGGATGTAAAGTGAAATATTAGTTGGCG AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAA
+                   +
BBBFFFFFFFFFFFIFFIFFIIIIFIIIFIIFIII B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000
CCTCCTAGGCGACCCAGACAATTATACCCTAGCCA TGTTTAAGGGGTTGGCTAGGGTATAATTGTCTGGG
+                   +
BBBFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII BBBFFFFFFFFFFIIIIIIIIBFFIIIIIIIIIII
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000
TTCTATTTATTACCTCAGAAGTTTTTTTCTTCGCA GTAAAAGGCTCAGAAAAATCCTGCGAAGAAAAAAA
+                   +
BBBFFFFFFFFFFIIIIIIIIFIIFIIIFIIIIII BBBFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII
该文件如下所示:

paste - - - - < R1_sample.fastq | sort -k1 -t " " | tr "\t" "\n" > R1_sample_sorted.fastq
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000
TGATGTTTGGATGTAAAGTGAAATATTAGTTGGCG AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAA
+                   +
BBBFFFFFFFFFFFIFFIFFIIIIFIIIFIIFIII B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000
CCTCCTAGGCGACCCAGACAATTATACCCTAGCCA TGTTTAAGGGGTTGGCTAGGGTATAATTGTCTGGG
+                   +
BBBFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII BBBFFFFFFFFFFIIIIIIIIBFFIIIIIIIIIII
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000
TTCTATTTATTACCTCAGAAGTTTTTTTCTTCGCA GTAAAAGGCTCAGAAAAATCCTGCGAAGAAAAAAA
+                   +
BBBFFFFFFFFFFIIIIIIIIFIIFIIIFIIIIII BBBFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII
然后根据我从shuf那里得到的号码选择读卡器。例如,在第一次迭代中,我得到了1,所以我从第1列中选择了读取,在socond迭代中,我得到了2,所以从下一对读取中,我选择了第二列中的读取,等等

我被困在这里了。所以我的问题是,有没有一个简洁的方法可以做到这一点?也许用awk或其他方法?任何帮助都将不胜感激

对阿沙菲克斯回答的评论:
感谢您的回复,并对延迟的时间表示抱歉 我已经测试了您的解决方案,它们似乎都有缺陷。
对于第一个脚本,我构建了测试fastq文件R1和R2,每个文件包含6次读取。运行脚本后,我希望它也能以正确的顺序(ID、seq、desc、qual)输出6次读取(24行),但作为从R1或R2文件中随机选择的一组读取。我从剧本中得到的是:

@D3YGT8Q1:297:C7T4RACXX:3:1101:10002:27381 2:N:0:ATGCTCGTTCTCTCGT
AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCAAGATC
+
B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFIFIFIIIIIIIIII
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:50631 2:N:0:ATGCTCGTTCTCTCGT
@D3YGT8Q1:297:C7T4RACXX:3:1101:10007:32152 1:N:0:ATGCTCGTTCTCTCGT
GTAAGGTTAGGAGGGTGTTAATTATTAAAATTAAGGCGAAGTTTATTACTCTTTTTTGAATGTTG
+
BBBFFFFFFFFFFIIBFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFFFFFFFF
@D3YGT8Q1:297:C7T4RACXX:3:1101:10002:27381 2:N:0:ATGCTCGT
AGCTTCCTCTCTCTCTCTCTCTCTCTCTCTCCAGCCACATATTTCCATTCTCTCTCGCAGATATATTCTCTCTCTCATCATCCAACATCAAGATC
+

B0您可以尝试以下脚本(它也可以作为一个线性程序使用)。首先,它从您的第一个fastq文件中获取所有标题,然后随机选取一个fastq文件并从中返回4行。 请注意:这仅在两个文件在相同位置具有相同的标题时有效

#!/bin/bash
headers=$(grep @ R1_sample.fastq)
var=1
for line in $headers ; do 
  r=$(shuf -i1-2 -n1)
  tail -n +$var "R$r"_sample.fastq |  grep -m 1 -A 4 $line
  var=$((var+4))
done

或者,您可以展开合并并选择列方法<代码>剪切
用于从合并输出中删除随机列

#!/bin/bash
headers=$(grep @ merged.fastq)
var=1

for line in $headers ; do 
  r=$(shuf -i1-2 -n1)
  tail -n +$var merged.fastq | grep -m 1 -A 4 $line | cut -d$'\t' -f$r
  var=$((var+4))
done

您可以尝试下面的脚本(它也可以作为一个行程序使用)。首先,它从您的第一个fastq文件中获取所有标题,然后随机选取一个fastq文件并从中返回4行。 请注意:这仅在两个文件在相同位置具有相同的标题时有效

#!/bin/bash
headers=$(grep @ R1_sample.fastq)
var=1
for line in $headers ; do 
  r=$(shuf -i1-2 -n1)
  tail -n +$var "R$r"_sample.fastq |  grep -m 1 -A 4 $line
  var=$((var+4))
done

或者,您可以展开合并并选择列方法<代码>剪切用于从合并输出中删除随机列

#!/bin/bash
headers=$(grep @ merged.fastq)
var=1

for line in $headers ; do 
  r=$(shuf -i1-2 -n1)
  tail -n +$var merged.fastq | grep -m 1 -A 4 $line | cut -d$'\t' -f$r
  var=$((var+4))
done

脚本解决了你的问题吗?脚本解决了你的问题吗?