如何将awk变量传递给bash循环

时间:2014-07-17 11:39:31

标签: bash awk imagemagick parameter-passing

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

  1. 如何将变量从awk传递给bash以便我可以执行此操作? (以下代码中为$imageDirectory$productRef
  2. 我正在尝试避免使用大量system(someImageMagicCommand)类型的代码,因为看起来我正在尝试使用awk来做一些它不打算做的事情。有更好的方法吗?
  3. 这是伪代码示例,说明了我想要实现的目标:

        #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调整大小,然后返回到aws解释器 在csv文件中的相同记录 并继续输出HTML文件。

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

1 个答案:

答案 0 :(得分: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