请问如何对多个文件应用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
请调整如何填充变量,例如从生成,out
out=FILENAME; sub(/\.txt$/,".out",out)
File1.out
File1.txt
顺便说一下,不要对非导出变量名使用全大写,请参阅正确的 bash 和 shell 脚本变量大写。