Vim去除重复行

方法一:

先sort排序,再去重

:sort   //直接排序
:g/^\(.*\)$\n\1$/d                      //去除重复行
:g/\%(^\1$\n\)\@<=\(.*\)$/d     //功能同上,也是去除重复行
:g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d  //功能同上,也是去除重复行 

方法二:sort + uniq

sort file | uniq

方法三:使用awk

awk ‘!a[$0]++’ file

解析:

借用http://bbs.51cto.com/thread-964013-1.html

awk流程是逐行处理的,默认从文件的第一行一直处理到文件最后一行,还要知道awk的基本命令格式是'pattern{action}'先匹配各种各样的样式,然后大括号里处理如何打印输出,默认的只要匹配了pattern就{print $0},如果pattern未命中其判断值为假(0)那么就不会再去处理{action}了;pattern命中则为判断值为真(非0)就去处理{action}。
举个最简单的例子:awk '1' file和awk '{print $0}' file是一个道理,都是从头到尾依次打印文件的每一行。

'!a[$0]++'
分成几个部分简单解释下吧。
这个命令没有{action}也就是说,只要pattern部分判断值为真(非0)就打印该行,否则就跳过不打印
!在awk是取相反的意思,就是把对的变成错的把真的变成假的,放在这个命令中是神马作用一会解释;
a[$0]这个非常好理解,建立数组a,其变量是文本中的每一行,awk里$1是第一列,$2是第二列,以此类推$NF是最后一列,而$0是代表所有列及分隔符,也就是一整行,这样如果pattern是真的那就打印一整行
++的意思是a数组取变量完毕后,对该数组值+1
找个最简单的文档来解释一下

cat file
xxx
yyy
xxx
zzz

这个文件有4行,其中第一、三行是重复的。套用这个命令处理流程如下:
获取第一行a[xxx],因为这是第一行,数组a里从没见过xxx这个变量,那么自然他的值就是假(0)也就是说a[xxx]=0,这个时候!就有大作用了,他把a[xxx]假(0)变成了a[xxx]为真(!0)这个时候原本不该打印的第一行就变成了应该打印了,取逻辑反后对a[xxx]的值+1然后处理第二行
第二行a[yyy]这个情况跟刚才第一行的a[xxx]一样,也应该打印他
到第三行的时候情况变了,因为第一行已经出现过a[xxx]并且已经++过了,他的值已经是非0而不是前两行的0了,本应打印但这时候再由!取逻辑反就不必打印了
第四行a[zzz]就又和第一、二两行一样了。
所以执行完就是这个结果
awk '!a[$0]++' file 
xxx
yyy
zzz

再把file搞稍微复杂点

awk '{print NR,$0}' file
1 xxx
2 yyy
3 zzz
4 xxx
5 yyy
6 zzz
7 xxx
8 yyy
9 zzz

一共9行文本,3行一次重复。为了看得更清楚,本来默认的{print $0}稍微改下,变成{print NR,$0}。 NR表示行号。
那么现在来执行下刚才讲的试试看

awk '!a[$0]++{print NR,$0}' file
1 xxx
2 yyy
3 zzz

awk 'a[$0]++{print NR,$0}' file
4 xxx
5 yyy
6 zzz
7 xxx
8 yyy
9 zzz

很明显了吧,有!的命令是只打印第一次出现的$0也就是去除重复咯,而没有!的命令正好跟他相反,就是仅仅去除第一次出现的$0。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 "." 键来重复上一个指令。 例如,如果你想删除三,可以使用 "3dd" 命令,然后使用 "." 键来重复这个命令。 你还可以使用 "u" 键来撤销上一个指令,使用 "ctrl + r" 键来重做撤销的操作。 ### 回答2: 在 Vim 编辑器中,可以使用"."命令来重复上一个执过的指令。当我们在使用 Vim编辑时,我们可以执各种编辑操作,例如插入文本、删除文本、剪切与粘贴等等。当我们执某个操作成功后,我们可以使用"."命令来重复刚才的操作。 使用"."命令的方法很简单。当我们完成一个编辑操作后,可以按下英文句点"."来重复上一个指令。比如,如果我们先执了一次"dd"(删除当前),然后按下".",就会再次删除当前,相当于连续删除了两。 除了"."命令,Vim 还提供了其他一些可以用来重复操作的命令,其中包括数字加命令(例如"3dd"可以删除当前和下两)、重复搜索(使用"/"进搜索后按"N"进反向搜索)、跳转到上一个编辑位置(使用"''"命令)等等。 通过重复上一个指令,我们可以更加高效地进编辑操作,节省时间和精力。但是需要注意的是,"."命令只能重复最后一次执的指令,如果想要重复其他历史指令,可以使用其他的命令或者宏来完成。 ### 回答3: 在Vim中,可以使用"."命令来重复上一个指令。这个"."命令可以重复上一个指令,并且可以在一系列编辑操作中非常方便地使用。例如,如果我首先使用命令"dd"来删除一,然后使用"."命令,Vim将会再次执"dd"命令,从而删除下一。这对于重复简单的编辑操作非常有用,节省了时间和精力。 除了"."命令之外,还有一些其他的方法可以重复上一个指令。你可以使用"@"加上一个寄存器名字来重复该寄存器中的指令。例如,如果我首先在寄存器"a"中记录了一个删除的操作,然后使用"@a"命令,Vim将会执寄存器"a"中的删除操作,如果需要,可以反复执它。 此外,还可以使用Vim的宏来重复一系列的编辑操作。首先,你可以使用"q"命令来开始录制一个宏,然后执你想要重复的一系列编辑操作,最后使用"q"命令来停止录制宏。录制好宏后,你可以使用"@"加上宏名字来重复该宏。这种方式适用于需要执一系列复杂的编辑操作的情况。 总之,在Vim中,有多种方法可以重复上一个指令,你可以根据自己的需要选择最适合的方式来提高编辑效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值