将输出重定向到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中特定目录中的多个文件的主要内容,如果未能解决你的问题,请参考以下文章