Chinaunix

标题: 一个关于AWK的问题 [打印本页]

作者: wxytty    时间: 2007-02-26 17:07
标题: 一个关于AWK的问题
在别人写的一个SH里看见这么一个语句。
awk ' BEGIN{FS="[|]";OFS="|"}
FNR==NR{a[$1]=$2}
FNR<NR{if(!a[$1]) {$1="13";print}
else {$1=a[$1];print}}
' wj wj1>wj2


大大们能告诉我每一条语句的意思吗?
作者: xy-coordinate    时间: 2007-02-26 21:50
你还是到shell版块去吧!!!
作者: sunlan    时间: 2007-02-27 14:32
这个东西几句话说不清,还是去看awk的手册吧。
有本书叫《LINUX与UNIX Shell编程指南》,里面写得很详细的
作者: wenlq    时间: 2007-03-02 08:27
它在处理2个以|分割的文件
例如
文件1 wj 格式
id1|desc1
文件2 wj1格式
id2|desc2

FNR==NR{a[$1]=$2} 意思是处理第一个文件时 把 desc1 赋值给 数组 a 的 a[id1] 单元。
FNR<NR 条件是在处理第2文件成立。这样在处理第2 文件时
{if(!a[$1]) {$1="13";print}
else {$1=a[$1];print
如果a[$1] 是空,就把第2文件那行的第1列替换为 13 输出 如: 13|desc2
如果a[$1]非空,就是这个数组值已经在处理第1文件赋过值。就把$1替换为 a[$1] 即 文件1对应的$2。输出的就是 desc1|desc2

归纳一句 就是在文件2中以id2在文件1中查id1=id2的对应desc1 ,
找到输出 desc1|desc2
找不到输出 13|desc2



文件1
1|name1
2|name2
3|name3
5|name5
6|name6

文件2
1|name11
2|name22
3|name33
4|name44
5|name55
6|name66
7|name77
8|name88

输出结果
name1|name11
name2|name22
name3|name33
13|name44
name5|name55
name6|name66
13|name77
13|name88




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