根据列长度删除文本文件中的行 - Linux

时间:2015-12-17 14:55:14

标签: linux

我有一个包含如下所示行的大文件。在Unix中是否有sed或awk命令我可以用来删除第二列中数据长度<60的每一行。在这个例子中,我将只留下前3行。 到目前为止,我尝试过不成功。

Query1  1041  SVTQLTNDLFQTYLRKILS*MFKVIGCSDLLGNPLTLATN*IDGVLDLVQEPWSNS*KLS  862
Query1  1707  TTSNLTWLMQKNYMRQGILQFYKVIGSSDLLGNPIGLIDKLGSGVLEFFSEPYKGLLKPG  1767
Query1  2131  TIQTLSNLIIKNYVRQGILQFYKILGSSDILGNPIGLIDNLGTGVVEFFSEPYKGMLKPG  2191
Query1  1                                                 VFEFFNEPAKGLLKPK  17

2 个答案:

答案 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数组