这是我的第一篇文章,所以我希望我能够说清楚,如果不是,请原谅我。
基本上,我有很多标签分隔文件(有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
我想只获得包含以下内容的行:
第一栏中的两个点AND
以IP_开头,在第二列AND
对最后一栏充满信心
使用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_*.1
或A59562, IP_*.1, P51262...
或A95956, P51516...
,我只想获得 IP_ .1, IP _ .1 行。
有什么想法吗?
答案 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