【问题标题】:How to pass awk variables to a bash loop如何将 awk 变量传递给 bash 循环
【发布时间】:2014-07-17 11:39:31
【问题描述】:

我正在 awk 中处理一个 csv 文件。在执行脚本的过程中,我需要退出 awk 一段时间,然后根据 csv 文件中处理的信息 awk 在 bash shell 中进行一些 ImageMagick 处理。我正在尝试在 shell 中进行此图像处理,因为我遍历了指定目录中的所有 jpg 文件。我的问题是双重的:

  1. 如何将变量从 awk 传递到 bash 以便我可以做到这一点? (在下面的代码中是$imageDirectory$productRef
  2. 我试图避免使用大量system(someImageMagicCommand) 类型的代码,因为看起来我正试图使用​​ awk 来做一些它不适合做的事情。有更好的方法吗?

这是说明我想要实现的目标的伪代码示例:

    #blah blah blah awk code
    #leave awk interpreter, go into bash
    '
    resizesize="200x200";
    #concatenate with *.jpg suffix for listing all the jpg files in the imageDirectory
    imageDirectoryWithSuffix="$imageDirectory/*.jpg";
    for i in `ls $imageDirectoryWithSuffix`
    do
            #imageMagick converts large images to thumbnails
            convert $i $resizeSize -otherFlagsEtc assets/$productRef/thumbs/$i
    done
    '#back into awk, more csv processing now...

澄清背景:我有一个包含产品信息和相关文件路径的 csv 文件(每行 1 个产品)。我正在尝试自动创建有关产品的网页。其中一部分涉及调整图像目录的大小,其位置在 csv 文件中作为字段给出。因此,在脚本的中途,我试图离开 awk 解释器,调用 ImageMagick 来调整大小,然后返回到 awk 解释器在 csv 文件中的同一记录处 并继续输出 HTML 文件。

在我进入 ImageMagick 部分之前大约有 100 行(长)脚本代码,之后还有 100 行,所以根据@Bushmills 的回答,我认为最好的办法是在 bash 中编写我需要的 awk 变量一个小的临时文件,然后退出 awk 并从 bash 中读取临时文件。但是,我如何重新调用 awk 并让它从它停止的同一记录开始读取?还是我只需要留在 awk 并使用 system() 电话?将整个 bash for 循环包装在 awk system() 函数中似乎并不明智,但我想不出一种更优雅的方式来对整个文件目录调用 ImageMagick。

【问题讨论】:

  • 您向我们展示了一些由于周围的东西而无法正常工作的中间部分 - 真的很难提供帮助。我认为,如果您退后一步,用更多代码告诉我们整体问题和您当前的方法,您可能会做得更好。
  • @MarkSetchell 我已经根据上下文更新了问题。

标签: bash awk imagemagick parameter-passing


【解决方案1】:

fifo 可能是您继续前进的好方法。基本思想是您从awk 创建一个隧道并进入您的ImageMagick 内容,然后将来自awk 的请求通过隧道传递到ImageMagick。

所以你的主脚本可以这样做:

#!/bin/bash
...
mkfifo tunnel
ImageMagickScript &
...
awk '{...
      ...
      print directory size> "tunnel"
      ...
      ... } file
...
wait # for ImageMagick script that we started to finish

而您的 ImageMagick 脚本可以做到这一点

#!/bin/bash
while read directory size
do
    convert ... $directory $size ...
done < tunnel

【讨论】:

  • 工作得很好,谢谢。由于另一个问题,这比我预期的要付出更多的努力;我为迟到道歉。我也很欣赏为什么我需要在主脚本的最后一行 wait 的评论,因为我以前从来没有用命名管道编程,以及 perl 是否更适合做这种语言长期的事情(据我了解,这是您在使用 wordpress 之前所做的,您一定有自己的理由)
  • @Escher 没有绝对需要wait,它只是等待我们在第 4 行在后台启动的 ImageMagick 脚本完成。我这样做是为了以防您正在运行一些计时测试,并且在 ImageMagick 部分也完成处理之前,您的工作在技术上还没有完成,所以如果没有wait,它会给您一个关于需要多长时间的误导性想法——仅此而已。
  • @Escher 至于更合适的做法,我认为外壳很好。如果你有 20,000 多个文件,我会考虑使用 GNU Parallel 来做 ImageMagick 的东西,这样你所有的 4 或 8 个可爱的英特尔内核都会忙起来......就像parallel convert {} -resize ... -strip {.}new.jpg ::: *.jpg
  • 我最近不得不将大约 400 张图片分成 3 种不同的尺寸。令人惊讶的是,当我在 4 个内核而不是 1 个内核上运行时,它只将处理时间减半......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多