我有一个包含如下所示行的大文件。在Unix中是否有sed或awk命令我可以用来删除第二列中数据长度<60的每一行。在这个例子中,我将只留下前3行。 到目前为止,我尝试过不成功。
Query1 1041 SVTQLTNDLFQTYLRKILS*MFKVIGCSDLLGNPLTLATN*IDGVLDLVQEPWSNS*KLS 862
Query1 1707 TTSNLTWLMQKNYMRQGILQFYKVIGSSDLLGNPIGLIDKLGSGVLEFFSEPYKGLLKPG 1767
Query1 2131 TIQTLSNLIIKNYVRQGILQFYKILGSSDILGNPIGLIDNLGTGVVEFFSEPYKGMLKPG 2191
Query1 1 VFEFFNEPAKGLLKPK 17
答案 0 :(得分:2)
以下AWK脚本可以。
/[0-9A-Za-z]+\s+[0-9]+\s+[0-9A-Za-z*]{60,}+\s+[0-9]+/ { print($0); }
正则表达式与您要保留的行匹配。如果一条线匹配,则打印出来。您可能需要调整正则表达式以更精确地匹配您的输入格式。我只是从你所展示的几个例子中得出了我能推断出的模式。
正则表达式解释说:
[0-9A-Za-z]+
一个或多个字母数字字符\s+
一个或多个空格[0-9]+
一个或多个数字\s+
一个或多个空格[0-9A-Za-z*]{60,}+
六十个或更多字母数字字符和星号\s+
一个或多个空格[0-9]+
一个或多个数字另一种选择是使用
/./ { if (length($3) >= 60) print($0); }
假设所有行都是给定的列格式。它匹配任何一行,如果第三列足够宽,则有条件地打印它。
在AWK中,$N
指的是当前行的 N 列,而$0
指的是整行。默认情况下,列在空白处分割。
正如fedorqui在评论中指出的那样,语法更简洁
length($3) >= 60
可用于实现与AWK相同的效果,如果条件为真,则默认行为是打印当前行。我永远不会记得AWK中可以采用的所有快捷方式......
答案 1 :(得分:1)
Perl解决方案:
perl -ane 'print unless 60 > length $F[2]' file
-n
逐行读取输入行-a
将每一行拆分为空格@F
数组