我使用下面的代码从一个文件中读取记录,并将其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中。 我希望这将清除案件。 请帮忙。
答案 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结尾条目一样。如果这不是您想要的,那么这很容易解决。