我想要一个针对一般情况的解决方案(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