Циклический просмотр файлов и сбор данных

Циклический просмотр файлов и сбор данных

Хорошо, у меня есть проблема, с которой, я думаю, вы, ребята, можете помочь.

У меня 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 и на 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

Связанный контент