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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值