在终端

时间:2015-06-11 14:51:53

标签: linux unix awk grep

嗨,这对许多人来说可能是一个基本问题,但它已经成功地吃了几个小时。

我有大数据文件作为运行脚本的输出。该文件包含大约15列和大约100,000行。我希望搜索文件并在第4,5,6,7和8列中检查特定值(和字符串)。我知道我可以单独剪切列并查看它们或在less命令中使用向前搜索(“/”)。这里的问题是第二列和第三列也将包含我搜索的值(几乎在每隔一行)。我只需要第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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

好的,所以我假设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列。