Выведите результат команды в файл file.txt - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть скрипт, такой как:

cat list_id.txt | while read line; do for ACC in $line;
do
    echo -n "$ACC\t"
    curl -s "link=fasta&retmode=xml" |\
    grep TSeq_taxid |\
    cut -d '>' -f 2 |\
    cut -d '<' -f 1 |\
    tr -d "\n"
    echo 
sleep 0.25
done
done

Этот скрипт позволяет мне из списка идентификаторов в list_id.txt получать соответствующие имена в базе данных в https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nuccore&id=${ACC}&rettype=fasta&retmode=xml

Таким образом, из этого скрипта я получаю что-то вроде

CAA42669\t9913
V00181\t7154
AH002406\t538120

И что я хотел бы, это напечатать или повторить этот результат при вызове поля new_ids.txt, я попытался echo >> new_ids.txt, но файл пуст.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 20 февраля 2019

Минимальный рефакторинг вашего скрипта может выглядеть так:

# Avoid useless use of cat
# Use read -r
# Don't use upper case for private variables
while read -r line; do
  for acc in $line; do
    echo -n "$acc\t"
    # No backslash necessary after | character
    curl -s "link=fasta&retmode=xml" |
    # Probably use a proper XML parser for this
    grep TSeq_taxid |
    cut -d '>' -f 2 |
    cut -d '<' -f 1 |
    tr -d "\n"
    echo
    sleep 0.25
  done
done <list_id.txt >new_ids.txt

Это, вероятно, все еще может быть значительно упрощено, но без знания того, как точно выглядит ваш входной файл или что возвращает curl, этонесколько спекулятивный.

tr -s ' \t\n' '\n' <list_id.txt |
while read -r acc; do
    curl -s "link=fasta&retmode=xml" |
    awk -v acc="$acc" '/TSeq_taxid/ {
        split($0, a, /[<>]/); print acc "\t" a[3] }'
    sleep 0.25
done <list_id.txt >new_ids.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...