shell脚本去重复和几点注意

1.用SSH传到linux机器上的shell脚本,需要用
vim   dos.txt         
     :set fileformat=unix
     :w  

转换一下,否则有可能会syntax error: unexpected end of file异常。

2.如果要对文件去重
文本处理,原始数据:
a 1 1 1
b 2 2 2
c 3 3 3
a 4 4 4
b 5 5 5
c 6 6 6
希望依据第一域去除重复,即,对a 1 1 1 和 a 4 4 4只取一行。

实现方法如下:

[/testapp1/home/kttest/test]#cat data2
a 1 1 1
b 2 2 2
c 3 3 3
a 4 4 4
b 5 5 5
c 6 6 6
[/testapp1/home/kttest/test]#sort -u -1 data2
a 1 1 1
b 2 2 2
c 3 3 3
[/testapp1/home/kttest/test]#sort -k1 data2|awk '{if(a!=$1){print;a=$1}}'
a 1 1 1
b 2 2 2
c 3 3 3
[/testapp1/home/kttest/test]#awk '{a[$1]=$0}END{for (i in a) print a[i]}' data2
a 4 4 4
b 5 5 5
c 6 6 6
[/testapp1/home/kttest/test]#uniq -f0 -W1 data2
uniq: illegal option -- W
Usage: uniq [-cdu] [-f Fields] [-s Chars] [-Fields] [+Chars] [InFile [OutFile]]
[/testapp1/home/kttest/test]#


总结,以上用了四种方法实现

1、sort排序,- u去除重复,-1第一域为结尾
2、sort -k1,按第一域进行排序,然后使用awk工具将本行的第一域设置为$1,然后继续处理下行的第一域和$1对比,不等则输出。
3、awk数组实现
4、uniq,-f是跳过多少个域进行比较,-s是跳过多少个字符,-W是最多对多少个域进行比较,-w是最多对多少个字符进行比较。我的环境不支持-W参数,不再演示

猜你喜欢

转载自shadowsocks.iteye.com/blog/900109
今日推荐