如何使用循环将 awk 脚本应用于一个文件夹中的多个文件

Leo*_*ala 2 awk files

我正在尝试将一个 awk 脚本应用于一个文件夹中的所有文件,我正在使用:

for %%i in (*.txt) do (awk -f NormalizeFiles.awk "%%i" > new\"%%i")
Run Code Online (Sandbox Code Playgroud)

但后来我收到消息:

Syntactic error near the unexpected element '('
Run Code Online (Sandbox Code Playgroud)

我不知道是什么问题。

小智 5

看来您正在尝试通过 awk 运行输入文件并将结果保存为不同的文件名。除非您需要非常特殊的文件命名,否则这应该用于:

for i in *.txt; do
    awk -f NormalizeFiles.awk $i > $i.out
done
Run Code Online (Sandbox Code Playgroud)

尽管您的问题被标记为 bash,但正如有人指出的那样,您的语法不是 bash,例如括号的滥用。%% 语法使用不正确,它似乎与您的目标没有密切关系;但是,如果您想了解更多信息,您应该查看http://www.tldp.org/LDP/abs/abs-guide.pdf


cas*_*cas 5

awk 可以自己写入不同的文件。

例如

awk '{print > "new/"FILENAME}' *.txt
Run Code Online (Sandbox Code Playgroud)

你可以在你的NormalizeFiles.awk 脚本中使用类似的东西。

如果您不想> "new/"FILENAME为每个打印语句键入,您可以执行以下操作:

awk 'FNR == 1 { out = "new/"FILENAME } ; { print > out }' *.txt
Run Code Online (Sandbox Code Playgroud)

out每次脚本看到FNR == 1新文件的第一行 ( ) 时,都会更改输出文件(在变量中)。

顺便说一句,如果你的脚本有#!/usr/bin/awk -f作为第一线,是由可执行文件chmod,可以直接运行它只是./NormalizeFiles.awk-一样的,你会为一个可执行#!/bin/bash#!/usr/bin/perl等脚本。