shell脚本去重复和几点注意

shell脚本去重复和几点注意

1.用SSH传到linux机器上的shell脚本,需要用

Linux代码   vim   dos.txt                 :set fileformat=unix        :w    

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参数,不再演示

 

 

 

#按字段1排序,按字段2去重
sort -k1.1 $logfilepath | awk '!a[$2]++{print}' > outtestfileby2.log
#按字段1排序,按字段1去重
sort $logfilepath | awk '!a[$1]++{print}' > $outfilepath

#超简单的根据字段1来去重,但不排序
cat $logfilepath | awk '!a[$1]++' > $outfilepath
#gnu/linux/unix 开源平台

你可能感兴趣的:(shell脚本去重复和几点注意)