2015-06-11 3 views
0

Привет, это может быть основным вопросом для многих, но, тем не менее, ему удалось съесть пару часов моего времени.Поиск в текстовом файле в терминале

У меня есть большой файл данных как результат запуска скрипта. Файл содержит около 15 столбцов и около 100 000 строк. Я хочу выполнить поиск по файлу и в столбцах 4,5,6,7 и 8 проверить определенные значения (и строки). Я знаю, что я могу разрезать столбцы отдельно и просматривать их или использовать прямой поиск («/») в меньшей команде. Проблема здесь в втором и третьем столбцах также будет содержать значение (почти в каждой другой строке), которое я ищу. Мне нужны только значения в столбцах 4,5,6,7 и 8 для интерпретации результатов, а также мне нужно также просмотреть соседние столбцы. Как я могу это сделать? Я не хочу использовать какие-либо внешние языки, такие как R, python или perl, я ищу решения с помощью команд командной строки.

Я использую следующую команду для просмотра файла;

bzcat myfile.tsv.bz2 | column -t | less -S 

Любые материалы будут оценены по достоинству.

Пример того, как выглядят данные; (Это биологические данные в определенные промежутки времени)

col1 strt end Sample1 Sample2 Sample3 Sample4 Sample5 p.val1 p.val2 . ID 

ABC 1100 1200 2  2  2  2  3  NA 0.27403 PLD4  
BCD 1200 1300 4  3  4  4  2 0.88831 0.37662 CYP46A1 
CDE 1300 1400 2  1  4  2  1 0.77922 0.00519 CEBPE 
DEF 1400 1500 6  4  4  4  4 0.88182 NA  BRCA 
EFG 1500 1600 2  6  8  10  3 0.00779 0.01558 BRCA 

Скажите, что я хочу, чтобы просмотреть файл в целом и установить ограничения только для поиска столбцов 4,5,6,7 и 8. ~ M

+1

Можете ли вы привести пример строк, которые должны и не должны совпадать? – Sobrique

+0

Это абсолютно тривиально в awk, но отредактируйте свой вопрос, чтобы показать конкретный тестовый пример, включая ввод и вывод, чтобы мы правильно поняли детали. Ваш текущий пример не подходит, так как ему не хватает ожидаемого результата, и вы говорите, что хотите проверить «конкретные значения», но не говорите нам, какие значения и вы говорите, что хотите протестировать colum 8, а только показать 7 столбцов в вашем примере вход. Отправьте что-то ТОЧНО/ТОЧНО, что мы можем проверить потенциальное решение. –

+0

Опять же вы говорите, что хотите «искать столбцы 4,5,6,7 и 8», но вы по-прежнему не скажете нам, что именно вы хотите найти в этом образце входного файла или каков ожидаемый результат. –

ответ

1

Пока вы не измените свой вопрос, чтобы обеспечить больше информации, это то, что вы хотите ?:

$ awk '$4==1 && $6==4' file 
BCD 2 4 1  1 4 2 

выше была запущена против вашего публикуемую входного образца файла:

$ cat file 
col1 srt end col4 col5 col6 col7 
ABC 1 2 1  1 5 2 
BCD 2 4 1  1 4 2 
CDE 4 6 6  5 2 5 
DEF 6 8 4  4 4 4 
EFG 8 10 4  4 3 4 

Учитывая ваш комментарий ниже, это то, что вы хотите:

$ awk '{print $0 ($4==1 && $6==4 ? " <--- HERE I AM!" : "")}' file 
col1 srt end col4 col5 col6 col7 
ABC 1 2 1  1 5 2 
BCD 2 4 1  1 4 2 <--- HERE I AM! 
CDE 4 6 6  5 2 5 
DEF 6 8 4  4 4 4 
EFG 8 10 4  4 3 4 
+0

Спасибо, Ed, вышеприведенная команда изолирует определенную строку и отображает ее. Я хочу, чтобы определенная строка была просто выделена, пока весь файл открыт, так что я могу отметить, какой идентификатор ему соответствует, и так далее. Подобно '/' в меньшей команде, где он ищет шаблон, а 'n' показывает следующее вхождение.Просто я хочу ограничить этот параметр поиска конкретными столбцами при просмотре. – user3668772

+0

Извините, я не знаю, что означает «выделение, пока весь файл открыт». Вы запрашиваете какую-то кошку файла, но с изменением цвета шрифта или жирным шрифтом или отступом или чем-то еще, связанным с целевой линией? Опять же - отредактируйте свой вопрос, чтобы показать конкретный тестовый пример, включая ввод и вывод, чтобы мы правильно поняли детали. Не говорите нам, какие команды меньше вы хотите подражать, так как это предполагает, что мы используем меньше (чего я не знаю - никогда не слышал о нем «n»), просто скажите нам, что вы хотите сделать с тестовым примером. –

0

OK , поэтому я собираюсь предположить, что tsv означает значения, разделенные табуляцией.

Я хотел бы использовать Perl для этого:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $search_term = "some_term"; 
my @columns_to_check = (4,5,6,7,8); 

while (<>) { 
    my @cols = split; 
    for my $colnum (@columns_to_check) { 
     if ($cols[$colnum] =~ m/$search_term/) { 
      print; 
      last; 
     } 
    } 
} 

Примечание: $search_term является регулярным выражением. также: Perl начинает массивы в нуле, так что ваша колонка 1 может быть столбец 0.

+0

Hi Sobrique благодарит вас за ответ. Я боюсь, что я ищу решения, используя команду awk, grep или less в терминале, когда я непосредственно просматриваю файл. – user3668772

Смежные вопросы