Хорошо, я на самом деле забыл, что задавал этот вопрос, но кто-то только что проголосовал за этот пост, и с тех пор я понял это, поэтому я продолжу и опубликую ответ.
Для первого фрагмента вывода, который я перечислил выше,
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
Надеюсь, я объяснил это хорошо. Дайте мне знать, если мне нужно что-то уточнить.
Описываемое вами поведение связано с тем, что у вас есть лишний :
в вашем 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/
. Пространство не требуется, оно разрешено.