Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker 诊断工具


改进版:根据一个文件内容查找另一个文件中的所有对应内容

Linux awk 大约 1411 字

有文本1.txt,内容如下:

{"phone":"18633333333","code":"333333"}
{"phone":"18611111111","code":"111111"}
{"phone":"18655555555","code":"555555"}
{"phone":"18644444444","code":"444444"}
{"phone":"18622222222","code":"222222"}
{"phone":"18633333333","code":"000000"}
{"phone":"18655555555","code":"888888"}

有文本2.txt,内容如下:

18600000000
18633333333
18699999999
18611111111
18655555555

文本2中1863333333318655555555在文本中出现过多次,需找出所有数据。

解决方法

Linux 查找一个文件中的是否包含在另一个文件中一文中,虽已实现了根据一个文件内容查找另一个文件中的内容,但因为awk数组会覆盖,所以只能取最后一次出现的一条。

awk -F'"' '{if(ARGIND==1)phones[$4]=$0}{if(ARGIND>1 && ($1 in phones))print phones[$1]}' 1.txt 2.txt

改进方法

增加判断如果key已经在数组中了,则先取出原先内容,再加上换行符\n以及$0(原始内容JSON串)。

awk -F'"' '{if(ARGIND==1){if($4 in phones) phones[$4] = phones[$4]"\n"$0; else phones[$4] = $0}}{if(ARGIND>1 && ($1 in phones))print phones[$1]}' 1.txt 2.txt

输出:

{"phone":"18633333333","code":"333333"}
{"phone":"18633333333","code":"000000"}
{"phone":"18611111111","code":"111111"}
{"phone":"18655555555","code":"555555"}
{"phone":"18655555555","code":"888888"}

改进方法二

先将所有需要匹配的手机号加入到数组中,再用需要被匹配的字符串截取字段后进行判断是否在数组中。

awk -F '"phone":"' '{if(ARGIND==1)phones[$1]=$1}{if(ARGIND>1 && (substr($2,0,11) in phones)){print $0}}' 2.txt 1.txt

若反向匹配,即匹配不在内容中的手机号。!(phone in phones)取反用感叹号

awk -F '"phone":"' '{if(ARGIND==1)phones[$1]=$1}{if(ARGIND>1 && !(substr($2,0,11) in phones)){print $0}}' 2.txt 1.txt

特别注意

文件格式问题

阅读 2299 · 发布于 2019-08-26

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批