Сценарий bash с необязательными входными аргументами с использованием getopt

Хорошо, я на самом деле забыл, что задавал этот вопрос, но кто-то только что проголосовал за этот пост, и с тех пор я понял это, поэтому я продолжу и опубликую ответ.

Для первого фрагмента вывода, который я перечислил выше,

10      10011300        10011301        T       C
10      10012494        10012495        G       A
10      10028691        10028692        A       T
10      10093496        10093497        G       A
10      10102457        10102458        C       T
10      10103252        10103253        G       C
10      10122271        10122272        T       C
10      10128778        10128779        T       C
10      10130299        10130300        C       A
10      10148307        10148308        G       A

все, что мне нужно было сделать, это использовать следующую команду awk,

cat [inputfile.txt] | awk '{print $1"_"$3"\t"$4"\t"$5}' | sort -k1,1 > outputfileA.txt

Вывод будет выглядеть следующим образом, и все строки будут отсортированы по первому столбцу:

10_10011301        T       C
10_10012495        G       A
10_10028692        A       T
10_10093497        G       A

Я бы сделал то же самое для второго фрагмента кода,

1       10177   rs367896724
1       10235   rs540431307
1       10352   rs555500075
1       10505   rs548419688
1       10506   rs568405545

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

cat [inputfile.txt] | awk '{print $1"_"$2"\t"$3}' | sort -k1,1 > outputfileB.txt

Результат:

1_10177   rs367896724
1_10235   rs540431307
1_10352   rs555500075
1_10505   rs548419688
1_10506   rs568405545

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

join -1 1 -2 2 outputfileA.txt outputfileB.txt | tr ' ' '\t' > outputfileC.txt

tr ' ' '\t'переводит все пробелы в табуляции в выводе. Все строки с идентичными совпадениями между первым столбцом первого файла и первым столбцом второго файла записываются в выходной файл, который может выглядеть примерно так:

1_101850899     A       C       rs138958619
1_101856556     T       C       rs191666242
1_101867058     C       T       rs188447998
1_101874381     A       C       rs143747209
1_101877269     G       A       rs186149522
1_101878704     C       A       rs192815769
1_101885657     G       T       rs150829467
1_101891797     T       G       rs141886478
1_101893793     T       A       rs182950692
1_101897192     T       C       rs189527356

Надеюсь, я объяснил это хорошо. Дайте мне знать, если мне нужно что-то уточнить.

3
13.01.2021, 11:37
1 ответ

Описываемое вами поведение связано с тем, что у вас есть лишний :в вашем getopt. Просто измените свою строку getoptна эту, и она будет работать:

VARS=`getopt -o i:o: --long input:,output: -- "$@"`

Однако это очень, очень запутанный способ написания сценария. Вот более простая версия (, в которой также исправлены некоторые неверные приемы, такие как переменные с заглавными буквами ):

.
#!/bin/bash

##argument_script.sh
vars=$(getopt -o i:o: --long input:,output: -- "$@")
eval set -- "$vars"

mappe='/default/input/here/'
outputFolder='/default/input/here/'

# extract options and their arguments into variables.
for opt; do
    case "$opt" in
      -i|--input)
        mappe=$2
        shift 2
        ;;
      -o|--output)
        outputFolder=$2
        shift 2
        ;;
    esac
done
echo "mappe: $mappe"
echo "out: $outputFolder"

Теперь вы можете:

$./argument_script.sh -i /c/  -o /f/
mappe: /c/
out: /f/

Обратите внимание, что это также работает, если вы запустите ./argument_script.sh -i/c/ -o/f/. Пространство не требуется, оно разрешено.

0
18.03.2021, 22:37

Теги

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