Проблема выглядит простой и распространенной, поэтому я просмотрел много ответов, но кажется, что ни один из них не дает соответствующего общего решения.
Мне нужно grep
большой разделенный табуляцией файл из 6 столбцов (фактически файл * .bed), чтобы разделить его на содержимое первого столбца, используя список строковых переменных (элементов). Мне просто нужна строка, начинающаяся с данной строки.
Я успешно использовал
grep -w "$name" inputfile
$name
читается из списка строк
с этой целью до случая, когда строки имеют следующий формат (пример): YAL038W , но также YAL038W-A , YAL038W-B , ...
Таким образом, grep
с параметром -w
считает YAL038W идентичным YAL038W-A , YAL038W-B , поскольку "-
" является разделителем слов. он будет работать с "_
", но не с "-
".
Я нашел решения на основе awk
, которые работают нормально, например:
awk -F $'\t' -vsearch=$name '$1==search' inputfile
, но awk
очень медленно, более 10 раз, см. Измерения времени ниже
Для входного файла 2,5 Гб и> 5000 элементов для поиска, скрипт уже работает> 24 часа!
Пример файла ввода:
YAL038W-A 0 48 HWI-1KL176:101:CC27NACXX:3:2208:17646:92047 0 +
YAL038W-A 0 48 HWI-1KL176:101:CC27NACXX:3:2211:17326:31268 0 +
YAL038W 1 50 HWI-1KL176:101:CC27NACXX:8:1205:16311:19319 3 +
YAL038W 1 27 HWI-1KL176:101:CC27NACXX:8:2103:4951:94527 42 +
time grep -w "YAL038W" inputfile > testfile.txt
real 0m3.569s
time awk -F $'\t' -vsearch="YAL038W" '$1==search' inputfile > testfile.txt
real 0m29.521s
Я ищу решение FAST, использующее grep
или что-то еще, и мне нужно передать переменную этой команде в цикле.
Альтернативный вариант - изменить файл импута, заменив «-
» на «_
», но я считаю, что это последняя возможность ...
Заранее спасибо