Chinaunix

标题: 求awk替换文本的方法 [打印本页]

作者: ch.js    时间: 2006-06-11 11:52
标题: 求awk替换文本的方法
数据文件1
B|20060512|320803410|320803410010026|603091008200013282|00000000000000|010701|00|0|965.00|0|   |1 |000000000|603091008200013282 |43288.10|0.00|0.00|0.00|0.00|0.00|0.00|               |1000101000|
B|20060512|210283001|210283001088311|603091430200020732|00000000000000|020432|03|0|1000.00|0|   |1 |000000000|603091430200020732 |1022.62|5.00|0.00|0.00|0.00|0.00|0.00|               |1003400210|
B|20060512|320803220|320803220010034|603091008200013563|00000000000000|010701|00|0|106.00|0|   |1 |000000000|603091008200013563 |189194.71|0.00|0.00|0.00|0.00|0.00|0.00|               |1000101000|
B|20060512|530623006|530623006087830|603091100240168295|00000000000000|020432|03|0|1800.00|0|   |1 |000000000|603091100240168295 |1891.00|9.00|0.00|0.00|0.00|0.00|0.00|               |1003400210|
B|20060512|320803280|320803280010034|603091100240160788|00000000000000|010701|00|0|1000.00|0|   |1 |000000000|603091100240160788 |72029.58|0.00|0.00|0.00|0.00|0.00|0.00|               |1000101000|
B|20060512|320803240|320803240010016|603091100240160807|00000000000000|010701|00|0|1550.00|0|   |1 |000000000|603091100240160807 |40611.68|0.00|0.00|0.00|0.00|0.00|0.00|               |1000101000|
B|20060512|320803340|320803340010062|603091008200013311|00000000000000|010701|00|0|383.00|0|   |1 |000000000|603091008200013311 |31728.41|0.00|0.00|0.00|0.00|0.00|0.00|               |1000101000|
B|20060512|320803240|320803240010015|603091100240160807|00000000000000|010701|00|0|1100.00|0|   |1 |000000000|603091100240160807 |39061.68|0.00|0.00|0.00|0.00|0.00|0.00|               |1000101000|
B|20060512|320803270|320803270010019|603091008200013580|00000000000000|010701|00|0|569.00|0|   |1 |000000000|603091008200013580 |77170.07|0.00|0.00|0.00|0.00|0.00|0.00|               |1000101000|

列表文件1
010101|活期开户
010102|活期续存
010103|活期取款
010104|活期销户
010110|多笔查询测试
010112|修改日期
010201|定期开户

列表文件2
320803008|楚州区板闸
320803100|楚州区镇淮楼
320803110|楚州区建淮
320803120|楚州区三堡
320803150|楚州区范集
320803160|楚州区白马湖
320803170|楚州区林集
320803180|楚州区南闸
320803190|楚州区平桥
320803210|楚州区车桥

问题是:用awk把数据文件1的第三列按列表文件2替换,第七列按列表文件1替换,请给出方法!谢谢

[ 本帖最后由 ch.js 于 2006-6-20 15:50 编辑 ]
作者: zongyaotang    时间: 2006-06-11 22:56
假设“列表文件1”中的空格是用“#”替换了的。
该脚本只替换列表文件1
列表文件2的替换可以照此办理,应该不难了。

FNM=数据文件1
DC=列表文件1

awk -F# -v DIC=$DC 'BEGIN {
        cnt = 0
        while(getline < DIC > 0)
        {       a[cnt] = $1
                b[cnt++] = $2
        }
        total= cnt
}
{       for(i = 0; i < total; i++)  gsub(a[i], b[i], $0)
        printf("%s\n", $0)
        while(getline > 0)
        {       for(i = 0; i < total; i++)  gsub(a[i], b[i], $0)
                printf("%s\n", $0)
        }
}' $FNM
exit
~
作者: shitou9000    时间: 2006-06-12 04:54
awk -F "[ | ]" 'BEGIN{OFS="|"}FILENAME~"c"{a[$1]=$3}FILENAME~"b"{b[$1]=$2}FILENAME~"a"{print a[$3],b[$7]}' b c a
你的分割附有问题。给的文件也很奇怪。
文件a为数据文件1
文件b列表文件1
文件c列表文件2

[ 本帖最后由 shitou9000 于 2006-6-12 04:59 编辑 ]
作者: woodie    时间: 2006-06-12 15:59
楼上大致思路是正确的。
楼主的字段分隔符是比较乱,有|,有全角空格,还有半角空格。建议两个列表文件统一一下。
作者: ch.js    时间: 2006-06-14 18:41
标题: 谢谢各位
我的文件应该全是用“|”做分隔符的,发帖时在想表达的方法,没统一,对不起了!
我会认真学习的,谢谢了
作者: ch.js    时间: 2006-06-20 15:48
我的方法:
join -t"|" -a1 -1 3 -2 1 -o 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 2.2 数据文件1 列表文件2 | join -t"|" -a1 -1 7 -2 1 -o 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 2.2 - 列表文件1 | awk 'BEGIN{FS=OFS="|"}{if($26!="") $3=$26}{if($27!="") $7=$27}{print $0}' > out.txt
作者: zongyaotang    时间: 2006-06-29 21:44

作者: zongyaotang    时间: 2006-06-29 21:51
也适合在另一个niuniu-2118提出的《替换》中的问题

[ 本帖最后由 zongyaotang 于 2006-6-29 22:02 编辑 ]
作者: jonish    时间: 2012-11-13 07:52
mark,正好在研究这个




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2