gpt4 book ai didi

linux - bash 脚本中的 Awk 读取字段

转载 作者:太空宇宙 更新时间:2023-11-04 09:41:18 25 4
gpt4 key购买 nike

我正在尝试读取两个文本文件,以便检查两个文件中的某些字段是否相同。我可以轻松地在命令行中提取字段,但是从 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 代表脚本中的循环变量)

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 { ... } block 包含脚本启动时要执行的操作。 FNR==i { ... } block 包含读取文件第 *i* 行时要执行的操作。

无条件 block { ... } 包含无条件执行的操作,即针对每个输入行。但是 FNR==i 不是一个有意义的 Action ;它只是一个 bool 值,当文件的行号等于 i 时为真。这是一个很好的条件,但作为一个 Action ,它不会做任何事情(您可以从外部检测到)。

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

关于linux - bash 脚本中的 Awk 读取字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21117360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com