Я использую столбец в одном файле для поиска значений в другом файле. Второй файл очень большой, и я хотел бы найти все значения за один проход с помощью awk. Я пытался сделать это с помощью ассоциативного массива, но не знаю, как получить результат, который я хочу. Я хочу взять F1, использовать $2 для поиска значений в F2 и получить вывод, показанный ниже, который представляет собой $0 из F1 в качестве заголовка, за которым следуют $10 из F2, отсортированные и подсчитанные для каждой уникальной строки (т.е. пропущенные через sort | уникальный -с).
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 BBBBBBA@BBBAB@?B@BBBB<5BBBAA@:>>&B7
solid309_20110930_FRAG_BC_bcSample12295_323_1714_F3 0 NC_012759 12121 42 35M * 0 0 ACACAACCACATGATGACCGAATATATAGTGGAGA BB@@A@@A@@@?@<=?@@=><6*7=?9993>4&7,
solid309_20110930_FRAG_BC_bcSample12325_1148_609_F3 0 NC_012759 12121 42 35M * 0 0 ACACAACCACATGATGACCGAATATATAGTGGAGA BBBB@B@?@B@@A@??BBBA@<.<==: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;BBBBBB@ABB;@7AA@@A@*>?+B8@9
Я делаю это с помощью следующего скрипта
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-liner, если вы удалите sort | уникальный -с. Это кажется очень близким к тому, что должно работать, учитывая ваше описание «использование столбца в одном файле для поиска значений в другом файле». НО вывод вашего примера, похоже, на самом деле не соответствует вашему заявленному требованию, «за которым следуют 10 долларов от F2, отсортированные и подсчитанные для каждой уникальной строки». Удачи. - person shellter   schedule 25.01.2014