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没有任何作用。 :(
答案 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
连续查找多个数字并记住它们,然后是一个空格,后跟您记住的任何数字。