Grep несколько файлов и вывод в несколько файлов в одной команде

Я хотел бы использовать grep для определенного шаблона из 244 файлов и сгенерировать соответствующие выходные файлы для каждого из них в одной команде, как мне это сделать?

Моя команда для одного файла выглядит следующим образом:

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, чтобы объединить информацию из выходных файлов в другой файл.

Если я введу команду grep для одного из этих файлов, напримерA1_001.fastq.sam, я получу следующую информацию:

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

Hope мой вопрос не слишком сложный.

0
23.06.2017, 01:55
2 ответа

Этого можно добиться, используя 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 \;

Примечание. Я не проверял это, так что вам, вероятно, придется исправить некоторые неточности с экранами и заполнителями, но это только начало.

1
28.01.2020, 02:45

Посмотрите, сможете ли вы создать функцию, которая может обрабатывать один файл:

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
0
28.01.2020, 02:45

Теги

Похожие вопросы