Предполагается, что два файла данных:
- rsID.txt , содержащий желаемый rsID для поиска:
rs142849724
rs141989890
- rsID_out.txt , содержащий:
"1","rs142849724","ENSG00000228794","ENST00000624927"
"2","rs142849724","ENSG00000228794","ENST00000623808"
"3","rs142849724","ENSG00000228794","ENST00000445118"
"4","rs142849724","ENSG00000228794","ENST00000448975"
"5","rs142849724","ENSG00000228794","ENST00000610067"
"6","rs142849724","ENSG00000228794","ENST00000608189"
"7","rs142849724","ENSG00000228794","ENST00000609139"
"8","rs142849724","ENSG00000228794","ENST00000449005"
"9","rs142849724","ENSG00000228794","ENST00000416570"
"10","rs142849724","ENSG00000228794","ENST00000623070"
"11","rs142849724","ENSG00000228794","ENST00000609009"
"12","rs142849724","ENSG00000228794","ENST00000622921"
"13","rs141989890","ENSG00000228794","ENST00000624927"
"14","rs141989890","ENSG00000228794","ENST00000623808"
"15","rs141989890","ENSG00000228794","ENST00000445118"
"16","rs141989890","ENSG00000228794","ENST00000448975"
"17","rs141989890","ENSG00000228794","ENST00000610067"
"18","rs141989890","ENSG00000228794","ENST00000608189"
"19","rs141989890","ENSG00000228794","ENST00000609139"
"20","rs141989890","ENSG00000228794","ENST00000449005"
"21","rs141989890","ENSG00000228794","ENST00000416570"
"22","rs141989890","ENSG00000228794","ENST00000623070"
"23","rs141989890","ENSG00000228794","ENST00000609009"
"24","rs141989890","ENSG00000228794","ENST00000622921"
, затем для получения запрошенного вывода с помощью awk
:
awk -F, '
NR==FNR {
x[$1]++
next
}
{
gsub(/"/, "", $2)
k = $2 ";" $3
}
$2 in x { a[k] = a[k] "|" $4 }
END {
for (k in a) {
sub(/[|]/, "", a[k])
print k ";" a[k]
}
}
' rsID.txt rsID_out.txt
NR==FNR {...}
- прочитать списокrsID для поиска gsub
- убрать двойные кавычки k
- ключ (rsID; "имя гена")? $2 in x
- толькоrsID процесса в списке END
- удалить первый канал, затем напечатать каждый ключ со значением
Примечание: Этот код предполагает, что строки не должны бытьсгруппированы и могут появляться в любом порядке.Объем памяти, используемой awk, будет приблизительно пропорционален размеру rsID_out.txt
, что может быть проблематично, если этот файл огромен.Альтернативные решения awk, например, Dudi Boy и Ed Morton, предполагают, что строки сгруппированы (разумное предположение на основе предоставленных выборочных данных).Это позволяет им только крошечный объем памяти.
Как предлагается в комментариях, вы также можете изменить свой код, используя sed.Примерно так:
while read line; do
res=$( grep "$line" rsID_out.txt | awk -F , '!seen[$3]++ {print $3}' )
ra=$( grep "$line" rsID_out.txt | awk -F , '{printf "|%s", $4} END {print ""}' | sed 's/[|]//' )
echo "$line;$res;$ra"
done < rsID.txt
Это будет несколько менее эффективно: для каждой строки ввода grep и awk вызываются два раза и sed один раз, а не один единственный вызов awk в целом.Для больших объемов данных это может иметь значение.