如何使用awk处理多个文件?

如何使用awk处理多个文件?

我想要一个针对一般情况的解决方案(N文件夹)

我正在使用 awk 处理文件并提取其内容并将其放入变量中然后回显它:

这是文件:

H1 H2 H3 H4 H5 H6 H7 H8 H9
not important
not
not

这是代码:

$value1=awk '/H1/ { print $1}' file
$value2=awk '/H1/ { print $2}' file
$value3=awk '/H1/ { print $3}' file
echo $value1
echo $value2
echo $value3

我得到结果:

H1
H2
H3

我的问题是,如果我有多个具有相同格式(不是确切内容,相同格式)的文件,并且该文件位于不同的文件夹中但名称相同:

/folder1
file
/folder2
file
/folder3
file

如何从这些文件夹中的每个文件中回显 H1 行的前 3 个值,以便获得 9 个结果?

答案1

我想知道你是否遗漏了一些问题,因为你似乎做了比你所说的想做的事情所需的更多的工作。如果我理解正确的话。

如果您想要做的只是输出(回显)文件中包含的行中的前三个字段(值)H1(假设只有一个这样的行),那么您需要做的就是

awk '/H1/ { 打印 $1, $2, $3 }'输入文件

或者,如果您希望值位于三个单独的行上,

awk '/H1/ { 打印 $1;打印 2 美元;打印 $3 }'输入文件

要对多个文件实现相同的结果,只需列出它们的名称,例如使用大括号扩展:

awk '/H1/ { 打印 $1;打印 2 美元;打印 $3 }' /文件夹{1,2,3}/文件

或使用通配符,正如其他答案所建议的那样:

awk '/H1/ { 打印 $1;打印 2 美元;打印 $3 }' /文件夹?/文件

如果您需要将值分配给变量,以便可以在脚本中操作它们,则需要更清楚地解释您的要求。

答案2

在您描述的示例中,类似以下的简单操作应该可以工作:

value1 = $(awk '/H1/ { print $1}' folder?/file)
value2 = $(awk '/H2/ { print $2}' folder?/file)
value3 = $(awk '/H3/ { print $3}' folder?/file)

你会得到:

echo $value1
H1 H1 H1

等等。

答案3

可以这样做

for i in $(awk '/H1/{print "Variable"++x"="$x}' folder?/file); do
    eval $i
done

相关内容