从文件中删除行

时间:2011-11-15 10:57:09

标签: text sed awk gawk

我有一个与此类似的问题: Delete lines from file with SED or AWK

如何删除以3和5开头的行以及此文件中的所有内容:

ssadfsadfsdf
asdfsadf
asdfsadf
asdfsadf
asdfsdf
1 z z z lkj klj lkj
2 satan er kaerleikur lkj lkj lkj
3 z z z
4 asdflj asd sdf
5 z z z
6 asdf sdaf asdf
7 z z z lkj lkj lkj
8 sdf safd asdf
9 z z z

如果答案显然在其他地方,我会删除这个问题。

如果它看起来像这样:

asd        ssadfsadfsdf
asd        asdfsadf
asd        asdfsadf
asd        asdfsadf
asd        asdfsdf
asd        1 z z z lkj klj lkj
asd        2 satan er kaerleikur lkj lkj lkj
asd        3 z z z
asd        4 asdflj asd sdf
asd        5 z z z
asd        6 asdf sdaf asdf
asd        7 z z z lkj lkj lkj
asd        8 sdf safd asdf
asd        9 z z z

4 个答案:

答案 0 :(得分:4)

您可以使用awk 范围模式跳过第1行到第2行的匹配模式:

awk '$1 == 3, $1 == 5 { next }; { print }' INFILE

我在字段$1上进行数字比较,而不是像/^3/这样的正则表达式,因为它也会匹配'30','31'等。

如果该数字是该行的第二个字段(如您编辑的示例输入中所示),则只需将$1更改为$2即可。如果这对您有用,请告诉我。

答案 1 :(得分:3)

一个快速的谷歌给了我这个秒钟回答:

http://www.cyberciti.biz/faq/sed-howto-remove-lines-paragraphs/

$ sed '/WORD1/,/WORD2/d' input.txt > output.txt

为了确保它与您所说的“行首”相匹配,您可以使用^符号启动模式。

如果您正在使用Vim(内置了sed),您可以执行range command之类的操作:

:/^3.*/,/^5.*/ d

其中d是删除命令,:/exp1/,/exp2/范围。

答案 2 :(得分:1)

awk '/^3/ {del=1}
     (del==0) {print}
     /^5/ {del=0}' FILE

答案 3 :(得分:0)

awk '$2!~/^[3|5]/' yourFile 

会为你做的。

见下面的测试:

kent$  echo "asd        ssadfsadfsdf
asd        asdfsadf
asd        asdfsadf
asd        asdfsadf
asd        asdfsdf
asd        1 z z z lkj klj lkj
asd        2 satan er kaerleikur lkj lkj lkj
asd        3 z z z
asd        4 asdflj asd sdf
asd        5 z z z
asd        6 asdf sdaf asdf
asd        7 z z z lkj lkj lkj
asd        8 sdf safd asdf
asd        9 z z z"|awk '$2!~/^[3|5]/'

输出:

asd        ssadfsadfsdf
asd        asdfsadf
asd        asdfsadf
asd        asdfsadf
asd        asdfsdf
asd        1 z z z lkj klj lkj
asd        2 satan er kaerleikur lkj lkj lkj
asd        4 asdflj asd sdf
asd        6 asdf sdaf asdf
asd        7 z z z lkj lkj lkj
asd        8 sdf safd asdf
asd        9 z z z