10G数据不用框架快速去重(2)

由于会员信息间通过“====================”分割,要实现一行显示一个会员只需要将“====================”替换成换行即可。

sed -i "s/====================/\n/g" test_menber.txt

查看test_menber.txt的内容

vi test_menber.txt 1 "内容" 2 " 3 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 4 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 5 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 6 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||" 7 " 8 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 9 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 10 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 11 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||" 12 " 13 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 14 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 15 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 ||| 16 会员名:鬼脚七||||||||||||||||||会员等级:军长第5年|||姓名:张三 |||"

10G数据不用框架快速去重

4、替换掉其他字符“””、空行和“|||”

#将“"”替换成空字符串 sed -i "s/\"//g" test_menber.txt #删除空行 sed -i '/^$/d' test_menber.txt #将分隔符|||换成@ sed -i "s/|||/@/g" test_menber.txt

10G数据不用框架快速去重

5、根据会员名去重

sort -t $"@" -k 1,1 -su test_menber.txt >test_uniq.txt

-t可以指定分隔符,-k指定排序的field, -su表示稳定排序并去重

查看结果

[root@bogon yichen]# more test_uniq.txt 会员名:鬼脚七@@@@@@会员等级:军长第5@姓名:张三 @ 内容

思路和测试完成了,但是文件比较多,一个个文件去处理也比较麻烦。因而写个脚本去处理即可

脚本批量处理

1、转换文件编码

[root@bogon yichen]# vi iconv_shell.sh #!/bin/sh if [ "$#" != "2" ]; then echo "Usage: `basename $0` dir filter" exit fi echo $1 for file in `find $1 -name "$2"`; do echo "$file" iconv -c -f gb2312 -t utf8 $file > ${file}_utf8

调用./iconv_shell.sh 目录 文件通配符,例如:

./iconv_shell.sh ./ "*txt"

此时生成的文件后缀为:.txt_utf8

2、提取会员信息

vi awk_filler.sh #!/bin/sh if [ "$#" != "2" ]; then echo "Usage: `basename $0` dir filter" exit fi for file in `find $1 -name "$2"`; do echo "$file" awk 'BEGIN{ FS=",";}{ print $4 }' $file > ${file}_menber done

调用

./awk_filler.sh ./ "*.txt_utf8"

此时生成的文件后缀为:.txt_utf8 _menber

3、替换“ ==================== ”、“””、“|||”和换行

vi sed_shell.sh #!/bin/sh if [ "$#" != "2" ]; then echo "Usage: `basename $0` dir filter" exit fi for file in `find $1 -name "$2"`; do echo "$file" sed -i "s/====================/\n/g; s/\"//g; /^$/d; s/|||/@/g" $file done for file in `find $1 -name "$2"`; do echo "$file" sed -i "/^$/d" $file done

sed支持多表达式:sed “表达式1;表达式2” filename,注意表达式之间用“;”号隔开。

调用:

sh ./sed_shell.sh ./ "*.txt_utf8_menber"

替换后的文件后缀仍为txt_utf8_menber

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/03d4f3210f40600633549e6202d23bde.html