0

我正在使用下面的代码从一个文件中读取记录,并将其 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,则将其放入新的 file_1,如果为 1,则将其放入 file_2。我希望这能澄清这个案子。请帮忙。

4

3 回答 3

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

您的编辑器的着色(甚至在 SO 上的问题显示中)应该清楚地说明这一点。您会注意到else没有匹配的 if,因此 shell 将其视为语法错误。

请注意,您正在重定向到一个名为{xxx_P}. 在文件名中放置{}字符是不常见的。

于 2012-12-12T17:44:47.060 回答
0

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

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

sed 脚本有些晦涩;它删除任何不匹配的行,然后用任何内容替换匹配的后缀,然后用合适的 awk 条件包装剩余部分。

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

于 2012-12-12T19:15:19.670 回答
0

这将完成您更新问题以说出您想要的内容(根据来自 file2 的信息拆分 file1)

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

当行的最后一个字段在 file2 中没有条目时,您没有说明如何处理来自 file1 的行,因此我的脚本将其视为与 file2 中有一个以 0 结尾的条目相同。如果这不是您想要的,这很容易解决。

于 2012-12-12T20:10:29.923 回答