Чтение файла в bash, выполнение запроса в MongoDB и добавление результата в последний столбец цикла while - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть файл TSV, который имеет 111 столбцов и 20 тыс. Строк. Я выполняю цикл while, чтобы прочитать каждую строку, выполнить запрос к конкретному столбцу в MongoDB и получить мой результат. Проблема в том, что ни awk, ни echo, ни cat, ни tr, ни sed не работают, когда я пытаюсь добавить результат в конце своей строки. Мой запрос извлекает счетчик функции find MongoDB. Возвращает только номер.

sed '1d' 10206.SNP.txt | while read line; do 
    array=($line)
    valquery=$(mongo --quiet  TestDatabase --eval "db.TestCollection.find( {\"Chromosome\": \"${array[0]}\", \"Position\": ${array[1]}, \"Reference\": \"${array[3]}\", \"Mutation\": \"${array[4]}\"} ).count()")
    stuff="$line$valquery"
    echo $stuff
done

или

sed '1d' 10206.SNP.txt | while read line; do 
    array=($line)
    valquery=$(mongo --quiet  TestDatabase --eval "db.TestCollection.find( {\"Chromosome\": \"${array[0]}\", \"Position\": ${array[1]}, \"Reference\": \"${array[3]}\", \"Mutation\": \"${array[4]}\"} ).count()")
    echo "$line" | awk -v val=$valquery '{gsub("\n",X,$0); print $0"\n"val}'
done

sed '1d' 10206.SNP.txt | while read line; do 
    array=($line)
    valquery=$(mongo --quiet  TestDatabase --eval "db.TestCollection.find( {\"Chromosome\": \"${array[0]}\", \"Position\": ${array[1]}, \"Reference\": \"${array[3]}\", \"Mutation\": \"${array[4]}\"} ).count()")
    echo "$line" | awk -v val=$valquery '{print $0"\t"val}'
done 

или

sed '1d' 10206.SNP.txt | while read line; do 
    array=($line)
    valquery=$(mongo --quiet  TestDatabase --eval "db.TestCollection.find( {\"Chromosome\": \"${array[0]}\", \"Position\": ${array[1]}, \"Reference\": \"${array[3]}\", \"Mutation\": \"${array[4]}\"} ).count()") && echo -e "$line" | tr -d '\n' | awk -v val=$valquery '{print $0"\t"val}'
done 

После перенаправления результатов моего запроса в файл я получаю что-то вроде:

chr1    ... lotsofcolumns ...   0.8481 0.9018 0.9983 gnomAD_EAS
    293 // The query result
chr1    ... lotsofcolumns ...   0.9854 0.9995 gnomAD_EAS
    997 // The query result
chr1    ... lotsofcolumns...    0.9314 0.9441 gnomAD_EAS
    2 // The query result

Я хотел бы вывести результат в одной строке для каждой строки, например:

chr1    ... lotsofcolumns ...   0.8481 0.9018 0.9983 gnomAD_EAS 293
chr1    ... lotsofcolumns ...   0.9854 0.9995 gnomAD_EAS    997 
chr1    ... lotsofcolumns...    0.9314 0.9441 gnomAD_EAS    2 

1 Ответ

0 голосов
/ 05 апреля 2019

Возврат каретки был фактически в самом $line.Но благодаря @RemisaYousefvand решение состоит в следующем:

sed '1d' 10206.SNP.txt | while read line; do 
    array=($line)
    valquery=$(mongo --quiet  TestDatabase --eval "db.TestCollection.find( {\"Chromosome\": \"${array[0]}\", \"Position\": ${array[1]}, \"Reference\": \"${array[3]}\", \"Mutation\": \"${array[4]}\"} ).count()")
    line2=$(echo "$line" | sed 's/\r$//g')
    echo -e "$line2\t$valquery"
done 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...