由于会员信息间通过“====================”分割,要实现一行显示一个会员只需要将“====================”替换成换行即可。
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年|||姓名:张三 |||"4、替换掉其他字符“””、空行和“|||”
#将“"”替换成空字符串 sed -i "s/\"//g" test_menber.txt #删除空行 sed -i '/^$/d' test_menber.txt #将分隔符|||换成@ sed -i "s/|||/@/g" test_menber.txt5、根据会员名去重
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 donesed支持多表达式:sed “表达式1;表达式2” filename,注意表达式之间用“;”号隔开。
调用:
sh ./sed_shell.sh ./ "*.txt_utf8_menber"替换后的文件后缀仍为txt_utf8_menber