Сделать grep для точного совпадения строк с и без дефиса "-" - PullRequest
1 голос
/ 22 мая 2019

Проблема выглядит простой и распространенной, поэтому я просмотрел много ответов, но кажется, что ни один из них не дает соответствующего общего решения. Мне нужно 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 или что-то еще, и мне нужно передать переменную этой команде в цикле. Альтернативный вариант - изменить файл импута, заменив «-» на «_», но я считаю, что это последняя возможность ... Заранее спасибо

1 Ответ

0 голосов
/ 22 мая 2019

Я нашел решения на основе awk, которые работают нормально, например:

awk -F $'\t' -vsearch=$name '$1==search' inputfile

но awk ужасно медленно ...

Я ищу БЫСТРОЕ решение, используя grep

Если указанная выше команда awk сработала для вас, то это будет делать:

grep ^$name$'\t' inputfile

Просто найдите в начале каждой строки имя, за которым следует табуляция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...