将输出重定向到for循环shell中特定目录中的多个文件

Posted

技术标签:

【中文标题】将输出重定向到for循环shell中特定目录中的多个文件【英文标题】:Redirect output to multiple files in a specific directory in for loop 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”中的输出,但他不仅只给了我目录输出的最后一个文件,即使他将我所有的文件转换都放在那个文件中,这不是我想要的就像我一开始描述的那样。我还想重定向特定文件夹中的输出

【问题讨论】:

【参考方案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/*

【讨论】:

以上是关于将输出重定向到for循环shell中特定目录中的多个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将输出重定向到 shell 中的变量? [复制]

如何理解Linux shell中的“2>&1”(将文件描述2(标准错误输出)的内容重定向到文件描述符1(标准输出))

Linux shell之重定向

shell脚本中的重定向符号

LINUX 标准错误输出重定向

记录历史命令,history,命令补全和别名通配符输入输出重定向