我想从 244 个文件中 grep 一个特定的模式,并在一个命令中为每个文件生成各自的输出文件,我该怎么做?
我对单个文件的命令如下:
grep -v '@SQ' *.sam | grep -v '@HD' cut -f 3 | sort | uniq -c | sort -nrk1 > output_count_file.txt
我如何一次性执行此操作,而不是对每个单独的文件执行 244 次?
我的输入文件的示例是:
A1_001.fastq.sam
A2_001.fastq.sam
B6_001.fastq.sam
我想将这些输入文件中的一些信息 grep 到各自的输出文件中,例如:
A1_001.txt
A2_001.txt
B6_001.txt
从这些输出文件中,我需要再次 grep 将输出文件中的信息合并到另一个文件中。
如果我对这些文件之一(例如 A1_001.fastq.sam)执行 grep,我将获得以下信息:
33 chr20:4804587-4804609__hsa_VP64_wgcod_3_27753
33 chr13:113242648-113242670__hsa_VP64_wgcod_2_46197
32 chr8:144718034-144718056__hsa_VP64_wgcod_2_48778
30 chr6:24126264-24126286__hsa_VP64_wgcod_1_71312
我需要通过与具有以下信息的参考文件进行比较来识别第二列中的基因名称(例如 chr20:4804587-4804609):
GTGCGCAGCGCTGAGTGTCG YBEY NM_001006114_utr5_0_0_chr21_47706267_f;NM_058181_utr5_0_0_chr21_47706267_f chr21 47706143 47706165
AGCAGGCGGACAGTAGGACG AUP1 NM_181575_utr5_11_0_chr2_74756757_r chr2 74757053 74757075
TAGGGGCAATGAATGGCGAG APEX2 NM_001271748_utr5_0_0_chrX_55026756_f;NM_014481_utr5_0_0_chrX_55026756_f chrX 55026610 55026632
希望我的问题不要太复杂。
答案1
您可以通过使用标志来实现这find
一点-exec
。这将遍历目录中的所有文件,并对grep
每个文件单独执行。您可以为输出文件放置一个占位符来区分它们。
该命令看起来像这样:
$ find . -iname "*.sam" -exec grep -v '@SQ' {} | grep -v '@HD' cut -f 3 | sort | uniq -c | sort -nrk1 > {}_output_count_file.txt \;
注意:我没有对此进行测试,因此您可能需要修复转义符和占位符的一些问题,但这是一个开始。
答案2
看看是否可以创建一个可以处理单个文件的函数:
doit() {
sam=$1
grep -v '@SQ' "$sam".sam |
grep -v '@HD' |
cut -f 3 |
sort |
uniq -c |
sort -nrk1 > "$sam"_count.txt
}
export -f doit
parallel doit {.} ::: *.sam