Shell脚本错误意外的其他令牌

时间:2012-12-11 23:35:47

标签: bash shell unix awk

我使用下面的代码从一个文件中读取记录,并将其6字段与其他文件进行比较,并相应地将输出写入文件。

for FILE_NAME in `GET_FILE_LIST $1 $2 $3`
do
y=`echo $FILE_NAME|awk '{print $6}'`"X"
echo "Start --- `date`" >> $LOGF
echo $y >> $LOGF
cat $x |nawk ' BEGIN { FS=",";
while ((getline < "SUBNO.txt") > 0)
     myarray[$1] = $2
if(myarray[$6]==0)   
    ' > {${FILE_NAME}_P}
else
    ' > {${FILE_NAME}_S}
fi

UPD_FILE_STATUS $FILE_NAME 35
done

问题是我正在跟踪错误:

./TEST.sh: line 95: syntax error near unexpected token `else'
./TEST.sh: line 95: `else'

我有以下案例: 在一个文本文件中,我有这样的数据:

GGO     099E7C5S    34  533196588       45696   22
PPC     93403DSA    35  784397429       44696   56

在第二个文件中数据是这样的:

22,0
24,1
26,0

我想要做的是从第一个文件写入行,将最后一个字段值与第二个文件进行比较。如果值为0则将其放在新文件_1中,如果为1,则将其放在file_2中。 我希望这将清除案件。 请帮忙。

3 个答案:

答案 0 :(得分:1)

此脚本中有一些很多的错误做法,我在此不再提及。你遇到的问题是你对引用规则感到困惑。考虑一下代码:

cat $x |nawk ' BEGIN { FS=",";
while ((getline < "SUBNO.txt") > 0)
     myarray[$1] = $2
if(myarray[$6]==0)   
    ' > {${FILE_NAME}_P}
else

单引号分隔传递给nawk的脚本,因此上面的代码基本上等于:

cat $x | nawk cmds > {${FILE_NAME}_P}
else

您的编辑器的颜色化(甚至在此处的问题显示中)也应该清楚。您会注意到else没有匹配的if,因此shell将其视为语法错误。

请注意,您要重定向到名为{xxx_P}的文件。将{}字符放在文件名中是不常见的。

答案 1 :(得分:0)

以下将从file2中提取其第六个字段在file1中带有“,0”后缀的所有行。它通过将file1中的相关行转换为简单的awk脚本来实现此目的。重复使用“,1”后缀来获取另一组,或者学习足够的awk以在一次通过中完成所有操作;这并不难。

sed /,0$/!d;s///;s/.*/$6 == "&"/p' file1 |
awk -f - file2

sed脚本有点模糊;它会删除任何不匹配的行,然后用任何内容替换匹配的后缀,然后使用合适的awk条件包装其余内容。

根据品味和要求,您可以将第二个脚本改为sed脚本(提示:查找w命令)或第一个脚本也是awk脚本。

答案 2 :(得分:0)

这将执行您更新问题以说出您想要的内容(根据来自file2的信息拆分文件1)

awk 'NR==FNR{sfx[$1]=$2; next} {print > ("file_" sfx[$NF]+0)}' FS="," file2 FS=" " file1

当行中的最后一个字段在file2中没有条目时,你没有说如何处理来自file1的行,所以我的脚本对待它就像在file2中有一个0结尾条目一样。如果这不是您想要的,那么这很容易解决。