将 awk exec 结果重定向到另一个文件夹

将 awk exec 结果重定向到另一个文件夹

尝试将与文件名模式“_base.txt”匹配的文件内容大写;然后将结果输出到另一个文件夹,并使用原始文件名加上“_cap.txt”。

我计划通过 3,000 个文件来完成此操作。所以我现在正在几个文件上测试它。

首先,我能够将内容大写。但所有输出结果均未重定向。

BASE="/home/dir/input/"
find "$BASE" -type f -iname "*.txt" -exec awk '{print toupper($0)}' {} + 

然后我添加了以下内容,这使我能够输出到以“_cap.txt”结尾的新文件名

BASE="/home/dir/input/"
find "$BASE" -type f -iname "*_pv_bind_basefile.txt" -exec awk '{print toupper($0) >> (FILENAME "_cap.txt")}' {} +  

当我尝试输出到特定文件夹时出现问题

BASE="/home/dir/input/"
OUT_FOLDER="/home/dir/output/"
find "$BASE" -type f -iname "*_pv_bind_basefile.txt" -exec awk '{print toupper($0) >> ($OUT_FOLDER FILENAME "_cap.txt")}' {} +

我收到以下错误消息

awk: 非法字段 $(),名称“OUT_FOLDER”输入记录号 1,文件 /home/dir/input/TAB1.a1.001.txt 源行号 1

我尝试了几次迭代来输出文件,但几个小时后惨败......这一定是我忽略或不知道如何做的一些简单的事情。任何建议将不胜感激。谢谢。

答案1

Shell 变量和 Awk 变量是不同的东西。

如果将变量导出到环境中,则可以通过 awk 的ENVIRON数组访问它 - 所以你可以这样做(注意:我省略了find,因为它不是问题的核心)

export OUT_FOLDER="/home/dir/output/"
awk '{print toupper($0) >> ENVIRON["OUT_FOLDER"] FILENAME "_cap.txt"}'

-v或者,您可以使用选项传递变量

OUT_FOLDER="/home/dir/output/"
awk -v out_folder="$OUT_FOLDER" '{print toupper($0) >> out_folder FILENAME "_cap.txt"}'

相关内容