工作笔记(四)

正则表达式

匹配任意字符:
原来是.*?(?是惰性匹配),发现不能匹配空格,如\t,\n等,正确的应为[\\s\\S]*?

匹配空格:
\\s+

vi显示文件中的换行符和制表符,命令:

:set list
显示结果中”$”表示换行符,”^|”表示制表符

任务1:从album_artist_result.txt中筛选出歌手名在part.txt中的内容

其中album_artist_result.txt内容格式如下:

29 另一面 Hevia 1
50 想念兄弟 凌峰 1
53 不忘初心 MC石情 1
65 为你们来唱歌 梁丰富 1
66 兄弟来干杯 梁丰富 1
69 一杯又一杯 梁丰富 1

part.txt内容格式如下:

陈乐基 陈乐基 {“play_count”: 10844, “rank”:0.8014}
顾莉雅 顾莉雅 {“play_count”: 10825, “rank”:0.80137}
豆豆 豆豆 {“play_count”: 10811, “rank”:0.80135}
郭少杰 郭少杰 {“play_count”: 10809, “rank”:0.80134}
玛俐亚 玛俐亚 {“play_count”: 10802, “rank”:0.80133}

1.取出album_artist_result.txt中的歌手名,存为tmp1.txt
awk -F’\t’ ‘{print $3}’ album_artist_result.txt > tmp1.txt

去重:
sort -u tmp1.txt > tmp1.txt

或者合在一起:
awk -F’\t’ ‘{print $3}’ album_artist_result.txt | sort -u > tmp1.txt

取出part.txt中的歌手名,存为tmp2.txt
awk -F’\t’ ‘{print $1}’ part.txt > tmp2.txt

去重:
sort -u tmp2.txt > tmp2.txt

2.取出tmp1.txt和tmp2.txt中共同的歌手,存为tmp3.txt
cat tmp1.txt tmp2.txt | sort | uniq -d > tmp3.txt

(另一种方法)
筛选出在tmp1.txt中但不在tmp2.txt中的歌手,存为tmp3.txt
cat tmp1.txt tmp2.txt tmp2.txt | sort | uniq -u > tmp3.txt

剔除掉tmp3.txt中的歌手,即为tmp1.txt和tmp2.txt中共同的歌手
cat tmp1.txt tmp3.txt tmp3.txt | sort | uniq -u > tmp4.txt

3.把tmp4.txt中数据复制3列
paste tmp4.txt tmp4.txt tmp4.txt > tmp5.txt,这样tmp5.txt内容就是歌手名复制了三列

4.合并album_artist_result.txt和tmp5.txt,先按照第三列,即歌手名排序,再按照第一列排序,但是是倒排,排序结果是歌手名相同的行排在一起,并且因为album_artist_result.txt中第一列是数字,所以一定会排在tmp5.txt的后面,
然后用awk筛选,如果第一列等于第三列,即为tmp5.txt中的数据,命名为last,然后对album_artist_result.txt中的数据第三列进行判断,如果等于last,则打印,将最后的结果按照第一列,即数字排序,输出到result中

cat album_artist_result.txt tmp5.txt | sort -k3,3 -k1,1r | awk -F’\t’ ‘{if ( 3==last)print;if( 3== 1)last= 3}’ | sort -k1,1n > result

注意上个命令sort -k1,1n,因为数字本身以字符串形式出现,如果不加n,则按照字符串排序,会导致‘2’排在‘1111’后面,加n后,把字符串转换成数字来排序。

任务2:把result.txt中第二列复制一次,然后把第三列的歌手名格式改为{“singer”:”歌手名”}

result.txt文件格式如下:

100094 海盗啤 叶文辉 1
100098 大男人情歌 叶文辉 1
100182 我爱上的 丁当 1
100183 当我的好朋友 丁当 1
100184 那些女孩教我的事 丁当 1

步骤:
1.把第二列复制一遍,并加上第三列,输出到tmp1.txt中

  awk '{print $2"\t"$2"\t"$3}' result.txt > tmp.txt

得到的tmp.txt中格式如下:
海盗啤 海盗啤 叶文辉
大男人情歌 大男人情歌 叶文辉
我爱上的 我爱上的 丁当
当我的好朋友 当我的好朋友 丁当
那些女孩教我的事 那些女孩教我的事 丁当

2.给第三列加上指定格式,输出到tmp2.txt中

  awk '$3="{\"singer\":\""$3"\"}"' tmp.txt > tmp2.txt

注意”要转义,即\”

得到最后要求的结果,tmp2.txt中内容格式如下:

海盗啤 海盗啤 {“singer”:”叶文辉”}
大男人情歌 大男人情歌 {“singer”:”叶文辉”}
我爱上的 我爱上的 {“singer”:”丁当”}
当我的好朋友 当我的好朋友 {“singer”:”丁当”}
那些女孩教我的事 那些女孩教我的事 {“singer”:”丁当”}

3.最后发现用\t来作为分隔符没有生效,显示是用的空格作为分隔符,因此需要更改,命令如下:

  sed 's/[ ]/\t/g' tmp2.txt > tmp3.txt

4.最后的最后,发现应该是第二步出了问题,因此直接一步完成

  awk '{print $2"\t"$2"\t{\"singer\":\""$3"\"}"}' result.txt > mytest.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值