ファイルをループしてデータを収集する

ファイルをループしてデータを収集する

はい、皆さんが解決できると思う問題があります。

フォルダーは24個あります。ラベルはAngle1、Angle2、...、Angle24です。

各フォルダのファイル名はoutput.txtです。

output.txt という名前の各ファイルで、特定の情報を取得します。

数字の入ったデータが 10 列ありますが、数字の長さは可変です。9 番目の数字列が欲しいのですが、これは文字の 9 番目の列という意味ではありません。46 列などになる可能性もあります。いずれにしても、各列は空白で区切られているので、おそらく役に立つでしょう。

Angle1、Angle2 などをループして、それぞれから 9 番目の列のデータを取得し、合計 24 列のデータを total.txt という親ディレクトリの新しいファイルに格納します。

これは不可能かもしれませんが、ただ興味があるだけです - それは可能ですか?

なお、私は Windows PowerShell を使用していますが、Ubuntu の方が簡単であれば、Ubuntu を使用することもできます。回答が両方の環境で機能しない場合は、どちらの環境向けであるかを示してください。

答え1

出力形式や集計関数が必要かどうかは指定しませんが、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

関連情報