今天被分配到对账组下的字段程序的了解和修改,在 SecureCRT 下的 run.sh 是字段对账的主程序,其中run.sh文件中含有gawk的代码。 程序的主要功能为 有两个文件夹 source存的是旧的采集系统采集的话单 target是新的采集系统采集的话单 实现具体的话单字段核对步骤为
-
将source下的所有.txt文件合并为一个话单文件 同理target下文件文件合并
-
按需要比较的字段 将合并的话单文件提取出核对字段(如主叫号码)
-
将比较字段排序,目的是比较核对时更加快
-
执行比较程序 .c文件
-
对核对后源文件没核对上的进行排序,此文件名同上一步输出文件.source同名
gawk是一种文件合并和处理的工具语言,http://wenku.baidu.com/view/0639c31755270722192ef738.html
http://wenku.baidu.com/view/90a872d5360cba1aa811dadc.html 这是gawk手册连接。
gawk '{v=FILENAME}!a[v]++1' ./source/*.txt >./source1.txt /*将比较源目录下所有文件合并*/
其中{}中是要执行的操作action ./为当前目录 就是将./下的source目录下的所有.txt文件合并到./下的source1.txt文件。' ' 里是程序的部分
gawk -f source.awk source1.txt>source.txt /*将比较源文件中需要比较的字段提出生成source.txt(此文件名可以更改),按分隔符用source.awk 按位置提用source_p.awk */
其中 -f 的意思指定要执行的命令 在source.awk 文件中 下面是 source.awk的具体代码
BEGIN { #FS="|" } { linebuffer=$4"~1"$5"~2"$6 gsub(/[[:blank:]]*/,"",linebuffer) #print linebuffer printf "%-254s%c ",linebuffer,0 }
BEGIN {}是定义东西的 #FS="|" 是定义了分隔符为"|" 既为用“|”分隔的话单 用分隔符去每行第4 5 6个 中间用~1和~2隔开 gsub函数则使得在所有正则表达式被匹配的时候都发生替换 gsub(regular expression, subsitution string, target string); 这里的 /[[:blank:]]*/ , "" , linebuffer linebuffer是要操作的字符串 按照正则表达式 用subsitution string 替换 与target string字符串想匹配的字符等。
sort -n -k1 -t~ target.txt -o target.txt /*对比较目标文件 target.txt 进行排序用主关键字段(主叫号码)来排序,这里的主关键字段是规定死的, 主要为了下面比较程序的快捷 */
substr(a,b,c) a为需要处理的字符串,b为字符串的第几个位置,c为取几个字符
substr($0,1,20)既为 $0值这一行(本行)(此为按位置分的话单)
run.sh
start=`date` gawk '{v=FILENAME}!a[v]++1' ./source/* >./source1.txt #先将source文件夹下的所有文件记录都复制到source1.txt中 end=`date` echo ${start}"---combine source files!---"${end} start=`date` gawk '{v=FILENAME}!a[v]++1' ./target/* >./target1.txt end=`date` echo ${start}"---combine target files!---"${end} start=`date` gawk -f source.awk source1.txt>source.txt #用awk截取source1.txt end=`date` echo ${start}"---deal source fields!---"${end} start=`date` gawk -f source.awk target1.txt>target.txt end=`date` echo ${start}"---deal target fields!---"${end} start=`date` sort -n -k1 -t~ target.txt -o target.txt end=`date` echo ${start}"---sort target file---"${end} start=`date` ./show_files source.txt target.txt t1 end=`date` echo ${start}"---compare source target---"${end} start=`date` sort -n -k1 -t~ t1.source -o t1.source end=`date` echo ${start}"---sort error source files---"${end} echo "it is over"
source.awk
BEGIN{FS=","} { linebuffer="7"$7"~8"$8"~1"$1"~2"$2"~4"$4"~6"$6"~11"$11"~12"$12"~15"$15"~30"$30"~35"$35"~53"$53"~54"$54 printf "%-510s%c ",linebuffer,0 gsub(/[[:blank:]]*/,"",linebuffer) }
定长awk
BEGIN{ #FS=","} { linebuffer=substr($0,1,5)~substr($0,6,7) printf "%-510s%c ",linebuffer,0 gsub(/[[:blank:]]*/,"",linebuffer) }