awk的批量replace功能

awk的批量replace功能

需求

现在需要替换一个文本

文本内容如下
$cat file
MD_D1TS_1_060_I
MD_D1TS_1_061_F
MD_D1TS_1_062_U
MD_D1TS_1_002_U
MD_D1TS_1_027_I
MD_D1TS_1_028_U
MD_D1TS_1_003_I
MD_D1TS_1_004_F
MD_D1TS_1_030_I
MD_D1TS_1_005_U
MD_D1TS_1_031_F
MD_D1TS_1_032_I
MD_D1TS_1_006_U
MD_D1TS_1_007_I
MD_D1TS_1_033_F
MD_D1TS_1_034_U
MD_D1TS_1_008_I
MD_D1TS_1_009_U
MD_D1TS_1_035_I
MD_D1TS_1_036_F

就是简单的替换,ctrl + F功能就能搞定的事
但由于数量太多13000+条数据,时间会浪费很多,而且容易出错
只需要每次把替换的内容修改一下,替换的内容都记录在文本name2name中
直接按照文本执行就可以了

$cat name2name
MD_D1TS_1_060   ATS1-1-60
MD_D1TS_1_061   ATS1-1-61
MD_D1TS_1_062   ATS1-1-62
MD_D1TS_1_002   ATS1-1-2
MD_D1TS_1_027   ATS1-1-27
MD_D1TS_1_028   ATS1-1-28
MD_D1TS_1_003   ATS1-1-3
MD_D1TS_1_004   ATS1-1-4
MD_D1TS_1_030   ATS1-1-30
MD_D1TS_1_005   ATS1-1-5
MD_D1TS_1_031   ATS1-1-31
MD_D1TS_1_032   ATS1-1-32
MD_D1TS_1_006   ATS1-1-6
MD_D1TS_1_007   ATS1-1-7
MD_D1TS_1_033   ATS1-1-33
MD_D1TS_1_034   ATS1-1-34
MD_D1TS_1_008   ATS1-1-8
MD_D1TS_1_009   ATS1-1-9
MD_D1TS_1_035   ATS1-1-35
MD_D1TS_1_036   ATS1-1-36

思路

遇到这个问题第一反应就是使用sed,还有就是windows下的notepad++,sublime等软件

但这里最重要的就是将name2name文件进行存储
然后按照这个对应处理

最后想了想还是用awk的数组最熟悉

将要替换的文件内容作为下标key,替换的内容作为值value
然后再读取下一个文件处理

遇到问题

这里算是一个小坑吧,记录下
原来都是直接将文件复制到vim里,然后处理
看内容太多了,使用剪切板速度慢,干脆直接用ftp传入
结果文件处理结果跟我不一样
后来就用了20行测试了一下,想看下问题出在哪里,得到的结果是正确的
我懵逼了,难道awk的数组有限制?毕竟13000+的内容
突然反应过来,windows下的格式问题
$dos2unix filename

解决

awk 'NR==FNR{a[$1]=$2;next}{for(i in a){sub(i,a[i])};print}' name2name file
简单的说明一下
使用NR==FNR;next功能等于将name2name文件内容存入数组
for(i in a)想要读取文件下标只有使用这个方法,而且没有顺序(哈希,我也不懂,但知道是随机顺序)
sub(find,replace) 这是awk一个自带的函数,就是一个replace功能
posted @ 2017-11-27 21:18  陈浩然201  阅读(1846)  评论(0编辑  收藏  举报