Я использую столбец в одном файле для поиска значений в другом файле. Второй файл очень большой, и я хотел бы найти все значения за один проход с awk. Я пробовал делать это с помощью ассоциативного массива, но я был в тупике, как получить доступ, который я хочу. Я хочу взять F1, использовать $ 2 для поиска значений в F2 и получить результат, который я покажу ниже, который равен $ 0 из F1 в качестве заголовка, за которым следуют $ 10 из F2, отсортированные и подсчитанные для каждой уникальной строки (т.е. uniq -c).Looping AWK ассоциативный массив
F1
+ID=dnaK.p01 12121 TTGGGCAGTTGAAACCAGACGTTTCGCCCCTATTACAGAC[T]CACAACCACATGATGACCG
F2
solid309_20110930_FRAG_BC_bcSample12273_1541_657_F3 0 NC_012759 12121 42 35M * 0 0 ACACAACCACATGATGACCGAATATATAGTGGCTC [email protected]@[email protected]<[email protected]:>>&B7
solid309_20110930_FRAG_BC_bcSample12295_323_1714_F3 0 NC_012759 12121 42 35M * 0 0 ACACAACCACATGATGACCGAATATATAGTGGAGA [email protected]@[email protected]@[email protected]@@[email protected]<[email protected]@=><6*7=?9993>4&7,
solid309_20110930_FRAG_BC_bcSample12325_1148_609_F3 0 NC_012759 12121 42 35M * 0 0 ACACAACCACATGATGACCGAATATATAGTGGAGA [email protected]@[email protected]@@[email protected][email protected]<.<==:6:1>9(<-
solid309_20110930_FRAG_BC_bcSample11796_1531_1170_F3 0 NC_012759 12122 42 35M * 0 0 CACAACCACATGATGACCGAATATATAGTGGAGCA '&&+&&)&')&0(.,',(.3+&&&+,&&&&&&&&&
solid309_20110930_FRAG_BC_bcSample12110_1166_1149_F3 0 NC_012759 12122 42 35M * 0 0 CACAACCACATGATGACCGAATATATAGTGGAGAC -(:18)538;,9277*'8:<)&,0-+)//3&'1+'
solid309_20110930_FRAG_BC_bcSample183_686_962_F3 0 NC_012759 12123 42 35M * 0 0 ACAACCACATGATGACCGAATATATAGTGGAGTGC BB?BBBB;[email protected];@[email protected]@[email protected]*>[email protected]
Я делаю это с помощью следующего сценария
for line in `awk '{if ($1~"-") print ($2-34);else print $2}' $1`
do
awk -v l=$line '{if ($1~"-") l=l+34;if ($2==l) print }' $1 >> f2
awk -v l=$line '{if ($4==l) print $10}' URA2.sam | sort | uniq -c |awk '{if ($1>15) print}'>> f2
done
, который требует несколько проходов с AWK для каждой строки. Я думал, что я мог бы использовать ассоциативный массив, сделанный из F1, чтобы сделать это с помощью одного проходить. F2 сортируется по $ 4. Я использовал следующий скрипт, чтобы попытаться получить требуемый результат.
awk 'FNR==NR{a[$2]=$0;next}$4 in a{print $10}' f1 f2 | sort | uniq -c
рассмотреть вопрос редактирования, чтобы показать, что выходной ток от 'awk' 1-вкладыша, если удалить тыс e сортировать | uniq -c. Это кажется очень близким к чему-то, что должно работать, учитывая ваше описание «использование столбца в одном файле для поиска значений в другом файле». НО ваш пример вывода, похоже, не соответствует вашему заявленному требованию ', за которым следуют $ 10 из F2, отсортированные и подсчитанные для каждой уникальной строки'. Удачи. – shellter
Нужно ли сортировать выходные данные для каждого заголовка, или это достаточно, чтобы он был уникальным с подсчетом? –
@EdMorton Значения под необходимостью сортировки для программы uniq, поскольку она учитывает только следующую строку при определении того, является ли строка uniq. – jeffpkamp