如何在同一行

时间:2016-04-27 17:03:25

标签: unix tabs grep

这是我的第一篇文章,所以我希望我能够说清楚,如果不是,请原谅我。

基本上,我有很多标签分隔文件(有22列),我想过滤掉符合我期望的行。

这就是我所拥有的:

2   IP_251781.1 3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Doubtful
2.1 IP_251781.1 3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  
2.1.1   IP_251781.1 3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Confident
3   IP_05000.1  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Doubtful
3.1 IP_05000.1  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  
3.1.1   IP_05000.1  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Doubtful
4   T19952  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Doubtful
4.1 T19952  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  
4.1.1   T19952  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Doubtful
5   O29920  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Confident
5.1 O29920  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  
5.1.1   O29920  3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Confident

我想只获得包含以下内容的行:

  1. 第一栏中的两个点AND

  2. 以IP_开头,在第二列AND

  3. 中以.1结束
  4. 对最后一栏充满信心

  5. 使用grep命令,我想得到以下一行:

    2.1.1   IP_251781.1 3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  Confident
    

    我认为grep能够做到,但我不知道该怎么做。

    我想应该有类似的东西

    grep "^*.*.*" myfile.txt | grep "IP_*.1" myfile.txt | grep "Confident$" myfile.txt
    

    有什么想法吗?

    *编辑*

    我已经得到了与我提供的示例一起使用的命令。

    grep -P "\d\.\d\.\d" rep.tsv | grep -P "Confident$"  | grep -P "IP_.*\.1"
    

    然而,我的样本不包含我对更大文件的偏好。 第二列可以被多个表达式占用,可以是IP_*.1, IP_*.1A59562, IP_*.1, P51262...A95956, P51516...,我只想获得 IP_ .1, IP _ .1 行。

    有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用awk在列上执行多种模式匹配:

awk -F'\t' '$1 ~ /\..*\./ && $2 ~ /^(IP_.*\.1(, )?)+$/ && $NF ~ /Confident/ {print}' myfile.txt

答案 1 :(得分:0)

你的猜测有一些错误:

grep "^*.*.*" myfile.txt | grep "IP_*.1" myfile.txt | grep "Confident$" myfile.txt

*不是任何字符,而是重复字符 除非你逃避角色,否则.是任何角色 只有第一个grep需要myfile.txt,其他greps将从管道获取输入。

您的猜测可以更正为下一个命令:

grep "^[0-9]*\.[0-9]*\.[0-9]*" myfile.txt| grep "IP_.*\.1"  | grep "Confident$"

如果您想在一个命令中使用它们,请使用(用双引号替换真实标签之间的空格)

grep "^[0-9]*\.[0-9]*\.[0-9]*   IP_.*\.1        .*      Confident$" myfile.txt

修改:使用grep -P

grep选项-P对数字和标签很有用。当你的grep支持-P时,上面的命令可以简化为

grep -P "^\d*\.\d*\.\d*\tIP_[^\t]*\.1\t.*\tConfident$" myfile.txt

由于问题已被编辑,答案也是如此:
您可以在grep中使用重复匹配,如下所示:

grep -P "^\d*\.\d*\.\d*\t(IP_[^\t, ]*\.1[, ]*)*\t.*\tConfident$" myfile.txt