正则表达式
匹配任意字符:
原来是.*?(?是惰性匹配),发现不能匹配空格,如\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