使用sort+uniq/awk/sed可以来完成。
方法一:利用sort以不重复的方式打印出文件所有的行并排序-u,表示unique。
sort -u file
方法二:利用sort先对文件按行排好序之后再交由uniq处理。sort -k 指定列,-t指定列分隔符。
sort -k 1 -t ':' file|uniq
方法三:利用sort+awk来完成。
sort file | awk '{if ($0!=line) print;line=$0}'
if ($0!=line) print;表示当前行是否等于上一行,不等于的话则打印,line开始是空的。line=$0表示当前行赋给line。
方法四:利用sort+sed来完成。
sort file | sed '$!N; /^\(.*\)\n\1$/!P;D'
sort file将文件排序,排好序之后,重复的行会相邻。sed的单引号内的编辑命令中,各条命令以分号隔开。
第一条语句:$!N;表示sed当前处理的行不是文件的最后一行时,读取下一行至当前处理的行的后面,一并存储在sed的Pattern Space(模式空间)中。$表示最后一行,!N表示不读取下一行。
第二条语句:/^\(.*\)\n\1$/!P;,斜杠//之间表示对行的匹配模式。匹配模式的描述是sed的对正则表达式的扩充。^\(.*\)表示开头起任意字符,\n表示换行符,\1表示对前面第一个小括号内的字符重复,$表示行末。所以/^\(.*\)\n\1$/整个意思是匹配换行符前后相同的两行。如this\nthis,这两行内存在sed模式空间内。!P表示匹配成功的话,就不打印当前行,sed是默认打印当前处理后的行。
第三条语句:D命令是删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed。这样就保证了sed的模式空间中除了最后一行时,不能读取下一行,sed的模式空间中始终有两行数据。