sed删除包含字符串的行,但不包含任何内容;用于环路的自动化

sed删除包含字符串的行,但不包含任何内容;用于环路的自动化,sed,Sed,Q1:Sed指定整行,如果该行只是字符串,则删除 我有一个包含以下几个数字的文件: 1 1 3 1 12 1 1 12 25 24 23 24 我想删除每行中相同的数字。为此,我使用了: sed'/1/d'new.file 或 sed-n'/11/!p'new.file 这是主要问题。如果我搜索模式'11',这意味着我也摆脱了'112'。因此,我希望模式指定整条线,如果指定了,则删除它 问题2:问题1的自动化 我还试图使这个问题自动化。第一列和第二列中的数字范围可以是1到25 到目前为止,

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


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

1 1
3 1
12 1
1 12
25 24
23 24
我想删除每行中相同的数字。为此,我使用了:
sed'/1/d'new.file
sed-n'/11/!p'new.file

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

问题2:问题1的自动化


我还试图使这个问题自动化。第一列和第二列中的数字范围可以是1到25

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

for ((i=1;i<26;i++)); do
 sed "/'$i' '$i'/d" < oldfile > newfile; mv newfile oldfile;
done
((i=1;i newfile;mv newfile oldfile; 完成
最后,这对旧文件没有任何影响。(

这对于awk来说更具可读性:

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

如果要求删除两个值相差1以内的行:

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

awk'{d=$1-$2;如果(-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

您也可以使用grep:
grep-E-v“([0-9])*\s\1”测试文件


查找一行中的多个数字,然后记住它们,后面是一个空格,后面是您记住的任何数字。

这是一个很好的答案!在整个方案中,它让我更接近答案。只需一个问题。可以在wk?那么除了删除带有'2 2'的行外,是否可以删除上面类似表达式中的'1 2'和'3 2'呢?感谢您的建议brandizzi!如果您能耐心等待,我还想删除比第二列的值高一点和低一点的值。例如,对于模式'2 2'删除'3 2'和'3 2'这将在1-25中完成。我使用了以下循环代码:for((I=1;i@Ali:算术需要除正则表达式以外的其他内容。这还与示例输入中的“1 12”匹配——它还将与“32 21”匹配。您需要锚定,并将量词移到括号中:
“^([0-9]+)\s+\1$”