Получение синтаксической ошибки при использовании awk в параллельной обработке - PullRequest
3 голосов
/ 02 июля 2019

У меня есть 44 .tsv файла в одной папке, и я хочу вычислить количество пересечений каждого попарно с помощью команды пересечения инструмента bedtools. каждый выходной файл будет иметь 4 столбца, и мне просто нужно сохранить только сумму значений столбца 4 в каждом выходном файле. Я могу сделать это легко, когда я делаю это по одному, но когда я использую параллельную обработку для выполнения всего процесса одновременно, я получаю синтаксическую ошибку

Вот код и результат, когда я пробую каждые две пары по одной вручную

$ bedtools intersect -a p1.tsv -b p2.tsv -c

chr1    1   5   1

chr1    8   12  1

chr1    18  20  1

chr1    21  25  0

bedtools intersect -a p1.tsv -b p2.tsv -c | awk '{sum+=$4} END {print sum}

3

Вот код и результат, когда я использую параллельную обработку

$ parallel "bedtools intersect -a {1} -b {2} -c |awk '{sum+=$4} END {print sum}'> {1}.{2}.intersect" ::: `ls *.tsv` ::: `ls *.tsv`

awk: cmd. line:1:{sum+=} END {print sum}
awk: cmd. line:1:            ^ syntax error
awk: cmd. line:1:{sum+=} END {print sum}
awk: cmd. line:1:            ^ syntax error
awk: cmd. line:1:{sum+=} END {print sum}
awk: cmd. line:1:            ^ syntax error
awk: cmd. line:1:{sum+=} END {print sum}
awk: cmd. line:1:            ^ syntax error

Результат должен составлять 44 * 44 файла, которые содержат одно единственное значение, например 3

Ответы [ 3 ]

3 голосов
/ 02 июля 2019

@ DudiBoy имеет хорошее решение. Но меня раздражает, что я должен сделать еще один файл только потому, что хочу вызвать GNU Parallel.

Так что вы также можете использовать функции. Таким образом, вам не нужно создавать новый файл:

doit() {
  bedtools intersect -a "$1" -b "$2" -c | awk '{sum+=$4} END {print sum}'
}
export -f doit

parallel --results {1}.{2}.intersect doit {1} {2} ::: *.tsv ::: *.tsv
2 голосов
/ 02 июля 2019

Я считаю, что @MarkSetchell - правильный ответ. Вы также можете попытаться очистить его, вставив сложную строку в скрипт bash, который вы можете протестировать.

intersect.bash

 #!/bin/bash
 bedtools intersect -a $1 -b $2 -c | awk '{sum+=$4} END {print sum}'

Проверка правильности функционирования intersect.bash, затем параллельное его выполнение.

parallel intersect.bash {1} {2}

удачи.

2 голосов
/ 02 июля 2019

Я думаю, вам нужно процитировать это так:

parallel bedtools intersect -a {1} -b {2} -c \| awk \'{sum+=\$4} END{print sum+0}\' \> {1}.{2}.intersect ::: *tsv ::: *tsv
...