sed删除包含字符串的行,除了;自动化使用for循环

时间:2011-07-25 11:39:03

标签: sed

Q1:Sed指定整行,如果该行只是字符串,则删除


我有一个包含以下几个数字的文件:

1 1
3 1
12 1
1 12
25 24
23 24

我想删除每行中相同的数字。为此我一直在使用: sed '/1 1/d' < old.file > new.file 要么 sed -n '/1 1/!p' < old.file > new.file

这是主要问题。如果我搜索模式'1 1',这意味着我也摆脱'1 12'。因此,我希望模式指定整行,如果是,则删除它。

Q2:问题1的自动化


我也在尝试自动解决这个问题。第一列和第二列中的数字范围可以是1到25。

到目前为止,这是我得到的:

for ((i=1;i<26;i++)); do
 sed "/'$i' '$i'/d" < oldfile > newfile; mv newfile oldfile;
done

最后这对oldfile没有任何作用。 :(

3 个答案:

答案 0 :(得分:1)

这对awk来说更具可读性:

awk '$1 == $2 {next} {print}' oldfile > newfile
根据评论

更新

如果要求删除两个值在1之间的行:

awk '{d = $1-$2; if (-1 <= d && d <= 1) next; else print}' oldfile

不幸的是,awk没有abs()(至少nawk和gawk没有)

答案 1 :(得分:1)

只需将第一个数字放在一个组(\([0-9]*\))中,然后使用反向引用(\1)查找它。由于要删除的行应仅包含 该组,因此请重复使用^标记行的开头,使用$标记行的结尾。例如,对于以下文件:

$ cat input 
1 1
3 1
12 1
1 12
12 12
12 13
13 13
25 24
23 24

......结果是:

$ sed '/^\([0-9]*\) \1$/d' input 
3 1
12 1
1 12
12 13
25 24
23 24

答案 2 :(得分:0)

您也可以使用grep执行:
grep -E -v "([0-9])*\s\1" testfile

连续查找多个数字并记住它们,然后是一个空格,后跟您记住的任何数字。