我创建了一个bash脚本,它将ASCII文件解析为逗号分隔的输出。它运作得很好。现在,逐渐引入这些文件的新文件布局。
我的脚本现在有两个解析函数(每个布局一个),我想调用它取决于ASCII文件头中存在的特定标记。该脚本的结构如下:
#!/bin/bash
function parseNewfile() {...parse stuff...return stuff...}
function parseOldfile() {...parse stuff...return stuff...}
#loop thru ASCII files array
i=0
while [ $i -lt $len ]; do
#check if file contains marker for new layout
grep CSVHeaderBox output_$i.ASC
#calls parsing function based on exit code
if [ $? -eq 0 ]
then
CXD=`parseNewfile`
else
CXD=`parseOldfile`
fi
echo ${array[$i]}| awk -v cxd=`echo $CXD` ....
let i++
done>>${outdir}/outfile.csv
...
脚本不会出错。它总是调用原始函数“parseOldfile”并忽略新函数。即使我专门用几个带有新布局的文件提供我的脚本。
我想做的事情似乎非常微不足道。我在这里缺少什么?
编辑:旧文件布局和新文件布局的示例。
1)旧文件布局
F779250B
=====BOX INFORMATION=====
Model = R15-100
Man Date = 07/17/2002
BIST Version = 3.77
SW Version = 0x122D
SW Name = v1b1645
HW Version = 1.1
Receiver ID = 00089787556
=====DISK INFORMATION=====
....
2)新文件布局
F779250B
=====BOX INFORMATION=====
Model = HR22-100
Man Date = 07/17/2008
BIST Version = 7.55
SW Version = 0x066D
SW Name = v18m1fgu
HW Version = 2.3
Receiver ID = 028910170936
CSVHeaderBox:Platform,ManufactureDate,BISTVersion,SWVersion,SWName,HWRevision,RID
CSVValuesBox:HR22-100,20080717,7.55,0x66D,v18m1fgu,2.3,028910170936
=====DISK INFORMATION=====
....
答案 0 :(得分:1)
这可能无法解决您的问题,但潜在的性能提升:而不是
grep CSVHeaderBox output_$i.ASC
#calls parsing function based on exit code
if [ $? -eq 0 ]
使用
if grep -q CSVHeaderBox output_$i.ASC
qrep -q将在第一场比赛中成功退出,因此不必扫描整个文件。另外你不必费心用$?变种
不要这样做:
awk -v cxd=`echo $CXD`
这样做:
awk -v cxd="$CXD"
答案 1 :(得分:0)
我不确定这是否解决了OP的要求
如果你的函数知道如何解析文件,那么awk
需要什么?
#/bin/bash
function f1() {
echo "f1() says $@"
}
function f2() {
echo "f2() says $@"
}
FUN="f1"
${FUN} "foo"
FUN="f2"
${FUN} "bar"
答案 2 :(得分:0)
我有点不好意思写这个,但我解决了我的“问题”。
在gedit(我在Ubuntu上)出了几十次关于“Trailing spaces”的错误之后,我将我的代码复制并粘贴到一个新文件中并重新运行我的脚本。
有效。
我没有解释原因。
感谢大家抽出时间。