![循环遍历文件并收集数据](https://linux22.com/image/1450624/%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E6%96%87%E4%BB%B6%E5%B9%B6%E6%94%B6%E9%9B%86%E6%95%B0%E6%8D%AE.png)
好的,我有一个问题,我想你们可以帮忙解决。
我有 24 个文件夹。标签为 Angle1、Angle2、...、Angle24
每个文件夹都有一个文件名output.txt
在每个名为 output.txt 的文件中,我想要获取某些信息。
数据有 10 列,其中有数字,但数字的长度是可变的。我想要第 9 列数字,但这并不意味着这只是第 9 列字符。它可能是 46 列或其他什么。无论如何,每列都由空格分隔,所以也许这会有用。
我想循环遍历 Angle1、Angle2 等并从每个中获取第 9 列数据,然后将总共 24 列数据放入父目录中名为 total.txt 的新文件中。
这也许是不可能的,但只是好奇 - 可能吗?
请注意,我使用的是 Windows PowerShell,但如果更方便,也可以使用 Ubuntu。如果任何答案在两种环境中都不起作用,请指出它适用于哪种环境。
答案1
您没有指定输出格式和/或是否需要某些聚合函数,但是将创建作为退出一列文件的一个示例脚本是:
for ((i=1;i<25;i++))
do
awk '{print $9}' Angle${i}/output.txt >>total.txt
done
如果您希望将每个文件的第 9 列作为列,则可以使用如下脚本:
awk '{print $9}' Angle1/output.txt >>tmp
for ((i=2;i<25;i++))
do
awk '{print $9}' Angle${i}/output.txt |paste -d " " tmp - >>total.txt
mv total.txt tmp
done
mv tmp total.txt
但只有当输入文件中的行数相同时,此方法才会有效。
这些脚本可以与任何 Bash/Korn shell 一起运行,并且可以在 Linux 和 Cygwin 上运行。
以下是我的测试。源文件:
[romeo@localhost tmp]$ cat PKA1/output.txt
1 2 3 4 5 6 7 8 9 0
2 3 4 5 6 7 8 9 0 1
3 4 5 6 7 8 9 0 1 2
[romeo@localhost tmp]$ cat PKA2/output.txt
3 4 5 6 7 8 9 0 1 2
4 5 6 7 8 9 0 1 2 3
5 6 7 8 9 0 1 2 3 4
[romeo@localhost tmp]$ cat PKA3/output.txt
6 7 8 9 0 1 2 3 4 5
7 8 9 0 1 2 3 4 5 6
8 9 0 1 2 3 4 5 6 7
我的脚本(经过编辑以代表我的环境):
[romeo@localhost tmp]$ cat z1
for ((i=1;i<4;i++))
do
awk '{print $9}' PKA${i}/output.txt >>total.txt
done
[romeo@localhost tmp]$ cat z2
awk '{print $9}' PKA1/output.txt >>tmp
for ((i=2;i<4;i++))
do
awk '{print $9}' PKA${i}/output.txt |paste -d " " tmp - >>total.txt
mv total.txt tmp
done
mv tmp total.txt
我的跑步方式如下:
[romeo@localhost tmp]$ rm total.txt
[romeo@localhost tmp]$ bash z1
[romeo@localhost tmp]$ cat total.txt
9
0
1
1
2
3
4
5
6
[romeo@localhost tmp]$ rm total.txt
[romeo@localhost tmp]$ bash z2
[romeo@localhost tmp]$ cat total.txt
9 1 4
0 2 5
1 3 6