尝试将与文件名模式“_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"}'