繁体   English   中英

awk在bash脚本中读取字段

[英]Awk reading fields in a bash script

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

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

printf "$servidor1$gfs1_dir$gfs1_file\n" >> 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 var时会出现同样的情况(我代表脚本中的循环变量)

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如何访问它有关。 我找不到正确的观点。

在此先感谢您的帮助。 我将继续处理这个问题并发现答案。

编辑

从评论中我添加了调用awk的bash脚本中的代码(希望它有助于理解我正在尝试的内容)。 我有两个文件,本地文件列表和服务器中的远程文件列表。 我尝试建立两个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时为true。 这是一个很好的条件,但作为一个动作,它没有做任何事情(你可以从外面发现)。

但是,您似乎试图解决的任务使用单个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM