shell脚本 gawk语言 综采话单 对账 字段核对

时间:2023-03-08 23:04:18
shell脚本 gawk语言 综采话单 对账 字段核对

今天被分配到对账组下的字段程序的了解和修改,在 SecureCRT 下的 run.sh 是字段对账的主程序,其中run.sh文件中含有gawk的代码。 程序的主要功能为 有两个文件夹 source存的是旧的采集系统采集的话单 target是新的采集系统采集的话单 实现具体的话单字段核对步骤为

  1. 将source下的所有.txt文件合并为一个话单文件 同理target下文件文件合并

  2. 按需要比较的字段 将合并的话单文件提取出核对字段(如主叫号码)

  3. 将比较字段排序,目的是比较核对时更加快

  4. 执行比较程序 .c文件

  5. 对核对后源文件没核对上的进行排序,此文件名同上一步输出文件.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=$"~1"$"~2"$
gsub(/[[:blank:]]*/,"",linebuffer)
#print linebuffer
printf "%-254s%c\n",linebuffer,
}

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=""$"~8"$"~1"$"~2"$"~4"$"~6"$"~11"$"~12"$"~15"$"~30"$"~35"$"~53"$"~54"$
printf "%-510s%c\n",linebuffer,
gsub(/[[:blank:]]*/,"",linebuffer)
}

定长awk

BEGIN{
#FS=","}
{
linebuffer=substr($,,)~substr($,,)
printf "%-510s%c\n",linebuffer,
gsub(/[[:blank:]]*/,"",linebuffer)
}