在bash脚本中读取字段时出错



我正在尝试读取两个文本文件,以便检查两个文件中的某些字段是否相同。我可以很容易地在命令行中提取字段,但从bash脚本中提取时会出现问题。

我在for循环中生成文件(文件列表)(尝试echo和printf命令)

printf "$servidor1$gfs1_dir$gfs1_filen" >> server1

您可以看到cat命令的输出

cat server1
ftp://server/pub/data/nccf/com/gfs/prod/gfs.2014011400/gfs.t00z.pgrbf00.grib2
ftp://server/pub/data/nccf/com/gfs/prod/gfs.2014011400/gfs.t00z.pgrbf06.grib2

如果我从命令行尝试,它运行良好。文件中显示了两行/记录:

awk 'BEGIN { FS="/"} {print $11}' server1
gfs.t00z.pgrbf00.grib2
gfs.t00z.pgrbf06.grib2

但如果我想设置FNR,就会出现错误(在脚本awk中,它用于构建一个名为fremote的变量)

awk 'BEGIN { FS="/"} { RS="n"} {FNR == 1} {print $11}' server1
gfs.t00z.pgrbf00.grib2
gfs.t00z.pgrbf06.grib2

当我在bash脚本中创建fremote变量时也会发生同样的情况(I代表脚本中的循环变量)

i=1
fremote=`awk -v i=$i 'BEGIN { FS="/"} { RS="n"} {FNR == i} {print $11}' servidor1-file.list`
echo $fremote
gfs.t00z.pgrbf00.grib2 gfs.t00z.pgrbf06.grib2

也许这与server1文件的创建方式有关,也许与awk访问它的方式有关。我找不到正确的观点。

提前感谢您的帮助。我会继续研究这个问题,如果找到答案,我会发布。

编辑

从注释中,我在bash脚本中添加了调用awk的代码(希望这有助于理解我正在尝试的内容)。我有两个文件,本地文件列表和服务器中的远程文件列表。我试着构建两个vars flocal和fremote来检查它们是否相同。也许有更简单、更聪明的检查方法。

while [ $i -le $nlocal ]  
do
flocal=`awk -v i=$i 'FNR == i {print $1}' lista.local`
fremote=`awk -v i=$i 'BEGIN { FS="/"} {FNR == $i} {print $11}' $2`
if [ "$flocal" != "$fremote" ]; then 
echo "Some file missing"  >> $log
flag_check_descarga=0
else
contador=$(($contador + 1))
echo $contador "Download OK" $flocal  >> $log
fi
i=$(( $i + 1 ))
done

您的语法错误。

awk -v i="$i" 'BEGIN { FS="/"; RS="n"}
FNR == i {print $11}' server1

BEGIN { ... }块包含脚本启动时要执行的操作。FNR==i { ... }块包含读取文件的第*i*行时要执行的操作。

无条件块{ ... }包含要无条件执行的动作,即对于每个输入行。但FNR==i并不是一个有意义的行动;它只是一个布尔值,当文件的行号等于i时,它是真的。这是一个极好的条件,但作为操作它什么都不做(你可以从外部检测到)。

然而,你似乎试图解决的任务用一个Awk脚本会更容易解决——@EtanReisner在评论中发布的那个对我来说很好——或者只是

comm -23 <(sort lista.remote) <(sort lista.local)

甚至,如果文件已经排序,

comm -23 lista.local lista.remote

最后,你可能会得到类似的东西

sort -o lista.local lista.local  # make sure lista.local is sorted
awk -F/ '{ print $11 }' server1 |
sort |
comm -23 - lista.local

为了与Unix精神保持一致,如果没有差异,这将悄悄地成功,如果缺少什么,则失败(使用非零退出代码退出)并打印丢失的条目。

如果你也想打印成功下载的文件,只需cat lista.local,或者类似sed 's/^/Successfully downloaded /' lista.local

相关内容

  • 没有找到相关文章

最新更新