【问题标题】:Redirect output to multiple files in a specific directory in for loop shell将输出重定向到for循环shell中特定目录中的多个文件
【发布时间】:2022-01-19 16:29:17
【问题描述】:

我有一个脚本,可以对目录中的每个文件使用 awk 命令执行一些操作。

为此,我使用 for 循环,但我希望为文件运行的每个 awk 命令将我的输出重定向到文件。像 1 个源文件 -> 1 个目标文件。

目前,我的外壳设置如下:

#!/bin/bash

FILES="/home/yha/AG2R/*"

for f in $FILES 
do 
    echo "Processing $f file.."; 
    awk -F ';' '$1=="TABLE" && $3=="" {printf "01 %s.\n\n", $2; next} {sub(/CHAR/,"PIC X", $2);printf "   * %s.\n\n     05 %s %s.\n\n", $3, $1, $2;}' $f > temp.cpy
done

如您所见,我重定向了“temp.cpy”中的输出,但他不仅只给了我目录输出的最后一个文件,即使他将我所有的文件转换都放在那个文件中,这不是我想要的就像我一开始描述的那样。我还想重定向特定文件夹中的输出

【问题讨论】:

    标签: bash unix awk sed


    【解决方案1】:

    使输出文件依赖于$f

    #!/bin/bash
    
    FILES="/home/yha/AG2R/*"
    target_dir=/home/yha/AG2R/COPY
    
    for f in $FILES 
    do 
        echo "Processing $f file.."; 
        base=$(basename "$f")
        awk -F ';' '$1=="TABLE" && $3=="" {printf "01 %s.\n\n", $2; next} {sub(/CHAR/,"PIC X", $2);printf "   * %s.\n\n     05 %s %s.\n\n", $3, $1, $2;}' "$f" > "$target_dir/$base"
    done
    

    【讨论】:

    • 非常感谢,有没有办法将输出文件放在特定目录中?
    • 当然。只需将目录名称放在开头即可。 > "dir/$f.cpy"
    • 我这样做了:“$TARGET_DIRECTORY/$f.cpy”,但我得到“没有这样的文件或目录”错误
    • 那么$TARGET_DIRECTORY一定是错的。如果它是相对路径名,请确保它相对于您的当前目录。使用绝对路径名可以避免问题。
    • 我已经更新了答案。您应该更新问题以说明您希望它们位于不同的目录中。
    【解决方案2】:

    awk 可以自己做:

    awk -F ';' '
        FNR == 1 {
            printf "Processing %s file..\n", FILENAME
            output = FILENAME ".out"
        }
        $1 == "TABLE" && $3 == "" {
            printf "01 %s.\n\n", $2 > output
            next
        } 
        {
            sub(/CHAR/,"PIC X", $2)
            printf "   * %s.\n\n     05 %s %s.\n\n", $3, $1, $2 > output
        }
    ' /home/yha/AG2R/*
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2013-10-09
      • 1970-01-01
      • 2011-01-09
      • 2021-11-05
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多