bash 循环中的 awk

bash 循环中的 awk

请问如何对多个文件应用awk?以下脚本不执行任何操作。

FILE=/media/linux/*.txt
for f in $FILES
do
    awk '{printf("%.4f %8.2f     1.000     1    1\n", $2, $4)}' $f > test$f.out
done

答案1

你有FILE=(单数)和for f in $FILES(复数)。除此之外,看看echo下面两条语句的输出差异:

$ ls tmp
File-0  File-1  File-2  File-3

$ files=tmp/File*
$ echo "$files"
tmp/File*

$ files=( tmp/File* )
$ echo "${files[@]}"
tmp/File-0 tmp/File-1 tmp/File-2 tmp/File-3

您可以使用以下命令从第一段代码中获取文件列表:

$ files=tmp/File*
$ echo $files
tmp/File-0 tmp/File-1 tmp/File-2 tmp/File-3

但随后您引入了一个未加引号的变量,该变量具有相关的问题/警告,请参阅https://mywiki.wooledge.org/Quotes

因此,如果您出于某种原因想编写一个循环,那就是:

files=( tmp/File* )
for f in "${files[@]}"; do
    awk 'script' "$f"
done

或者你可以在没有循环的情况下执行此操作:

files=( tmp/File* )
awk 'script' "${files[@]}"

要不就:

awk 'script' tmp/File*

如果您希望使用任一非循环命令为每个输入文件提供唯一的输出文件:

awk 'FNR==1{close(out); out=FILENAME ".out"} {print > out}' tmp/File*

这将从输入文件创建File1.txt.out输出文件。如果您想要不同的命名转换,File1.txt请调整如何填充变量,例如从生成,outout=FILENAME; sub(/\.txt$/,".out",out)File1.outFile1.txt

顺便说一下,不要对非导出变量名使用全大写,请参阅正确的 bash 和 shell 脚本变量大写

相关内容