2016-01-14 2 views
1

Я использую массив значений, и я хочу искать эти значения с помощью awk и вывода в файл. В строке awk, если я заменяю первые "$i" номерами, скрипт работает, но когда я пытаюсь использовать переменную "$i", сценарий больше не работает.Использование массива с Awk

declare -a arr=("5073770" "7577539") 
for i in "${arr[@]}" 
do 
    echo "$i" 

    awk -F'[;\t]' '$2 ~ "$i"{sub(/DP=/,"",$15); print $15}' $INPUT >> "$i" 
done 

Файл Я смотрю на содержит много строк, как следующее:

chr12 3356475 . C A 76.508 . AB=0;ABP=0;AC=2;AF=1;AN=2;AO=3;CIGAR=1X;DP=3;DPB=3;DPRA=0;EPP=9.52472;EPPR=0;GTI=0;LEN=1;MEANALT=1;MQM=60;MQMR=0;NS=1;NUMALT=1;ODDS=8.76405;PAIRED=0;PAIREDR=0;PAO=0;PQA=0;PQR=0;PRO=0;QA=111;QR=0;RO=0;RPP=9.52472;RPPR=0;RUN=1;SAF=3;SAP=9.52472;SAR=0;SRF=0;SRP=0;SRR=0;TYPE=snp GT:DP:RO:QR:AO:QA:GL 1/1:3:0:0:3:111:-10,-0.90309,0 
+0

Это поможет получить некоторые примеры данных. (Требуется вход и выход). Также: Должен ли быть bash/awk? – Sobrique

+0

Это не должно быть bash или awk. Я получаю значения, равные 'DP', из многих файлов, находящихся в определенном числовом месте. –

ответ

1

Передайте значение $i для AWK с помощью -v:

awk -F'[;\t]' -v var="$i" '$2 ~ var{sub(/DP=/,"",$15); print $15}' $INPUT >> "$i" 
1

AWK не будет иметь ни малейшего представления, что значение $ i оболочки, если вы явно не передаете его в awk как переменную

awk -F'[;\t]' -v "VAR=${i}" '$2 ~ VAR {.... 

Я ожидаю, что результат, который вы видите, потому что «я» не определено и трактуется как нулевой , что делает тест «$ 2 ~ $ 0 {...

1

Вы можете избежать AWK и сделать это в самом BASH:

arr=("5073770" "7577539" "3356475") 

for i in "${arr[@]}"; do 
    while IFS='['$'\t'';]' read -ra arr; do 
     [[ ${arr[1]} == *$i* ]] && { s="${arr[14]}"; echo "${s#DP=}"; } 
    done < "$INPUT" 
done 
Смежные вопросы