初めて自分の家と他人の家が違う、と意識した時

1300個のフォルダがあり、各フォルダにtxtファイルが格納されています。
各txtファイルのindex(行名)は同名、同順で60483行あり、値だけ異なります。
各txtファイルは名前に規則性はありません。

これを一つのtxtファイルにまとめる、つまり、60483×1300のtxtファイルにする方法を教えてください。

LinuxのコマンドかPythonのプログラムを使うかのいずれかの方法が知りたいです。

よろしくお願いいたします。

A 回答 (8件)

No.4です。


>C使ったこともないプログラム初心者です。
>このコードの意味はなんとなく分かるのですが、pythonでは書けないでしょうか。
すいません、私はpython使ったことないので書けるかもしれませんがわかりません。

>>inuxのコマンドかPythonのプログラムを使うかのいずれかの方法が知りたいです。
>無理じゃないかな。
と回答しましたが、pasteコマンドがあるのですね。私も知りませんでしたが、このコマンドが使えると思います。 あとは、インデックスの行をどう処理するかですね。
具体的な処理方法はわかりませんが、他の回答者の回答を参考に頑張ったください。
お役に立てずにすいませんでした。
    • good
    • 0
この回答へのお礼

ありがとうございます。
for文でやる方法について、頂いたご意見を基にpythonでコード書いてみましたが、何とかできました。
pasteを使ってもできそうなのですが、bashはもっと初心者なので、練習してみます。

お礼日時:2020/03/29 10:15

第一カラムが数字でないのならば、paste */*のあとで、sedを使ってフィルターできるけど、フォーマットをできないので、あまりきれいではないかな。



> cat a/1
a 1.2
b 248
c 33.3
d 4094

> cat b/2
a 23
b3j 0.3
c 3
d 40.4

> cat c/3
aw 49.3
ad 1000
af 3.445
a4 34.45

> paste */* | sed -e 's/\t[a-z][0-9a-z]*/ /g'
a 1.2 23 49.3
b 248 0.3 1000
c 33.3 3 3.445
d 4094 40.4 34.45


awkをうまく使えば一行できれいにできるかもしれないけど...
    • good
    • 0

ちょっとよくわからないのだけど、表のようなものを作るってことですか?


もしそうなら、これでどうですか?

> cat a/1
1
2
3
4
> cat b/2
a
b
c
d
> cat c/3
A
B
C
D

> paste */*
1 a A
2 b B
3 c C
4 d D
    • good
    • 0
この回答へのお礼

ありがとうございます。
はい、その通りです。
他の方の回答でもありましたが、pasteで列方向につなげることはできそうです。
問題は、各ファイルが

> cat sample_1
a 1
b 7
c 0
d 0
> cat sample_2
a 4
b 0.7
c 6
d 1

という形で1300個(1300サンプル)あって、各サンプルの値だけ取り出して列方向につなげて

> cat sample_combined
a 1 4  
b 7 0.7
c 0 6
d 0 1

という形にしたいです。
pasteのオプションでtxtの特定の行を指定するコマンドってありますか?
パット見なさそうでした。

お礼日時:2020/03/28 10:49
    • good
    • 0
この回答へのお礼

ありがとうございます。
これいけそうです!!
pasteで各ファイルを列方向につないで、pandasで不要な列を削除すれば、欲しいテーブルができそうです。
贅沢を言うと、各ファイルの値の列だけ取り出して、列方向に追加できれば最高なんですが、それってできますか?
pasteだとインデックスの列もそのまま追加されてしまいますよね。

お礼日時:2020/03/28 10:32

>つまり、60483×1300のtxtファイルにする方法


つまり、完成版の1行目を出力するには、1300個のファイルを読む必要があるということですね。

>inuxのコマンドかPythonのプログラムを使うかのいずれかの方法が知りたいです。
無理じゃないかな。
Cのプログラムを書いて動かすのが一番、楽な気がします。

1300個のファイルをオープンして
for(i=0; i<60483; i++) {
タイトル行を出力
 for(j=0; j<1300; j++) {
  j番目の入力ファイルから1行読む
  出力ファイルに改行せずに追記する
 }
改行出力
}

をプログラムすれば良いのでは?
    • good
    • 0
この回答へのお礼

ありがとうございます。
C使ったこともないプログラム初心者です。
このコードの意味はなんとなく分かるのですが、pythonでは書けないでしょうか。
ファイル名を一括で連番に変更すれば、for文使って各ファイルにアクセスできると思うので、各ファイルの値だけ取り出して追加していく作業を1300回繰り返せば良いのかなと思いました。

お礼日時:2020/03/28 10:40

No.1です



| 1300個の各ファイル(各サンプル)が60483の項目に対する固有の値を持っていて、
| その値を個々のファイルから取り出して一つのテキストファイルに結合する、という意味です。
| 60483×1300のテーブルになっている一つのtxtファイルをつくるということです。

No.2に書いたコマンドでそのとおりの動きになると思いますが、
なにか読み間違えてるのでしょうか・・・

こんな感じで理解しました
ファイルその1 ./0001/aaaa.txt
中身 1a,2a,3a,4a,5a,6a.....60483a

 ・・・

ファイルその1300 ./1300/aaaa.txt
中身 1z,2z,3z,4z,5z,6z.....60483z

出力 text.txt
中身 
 1a,2a,3a,4a,5a,6a.....60483a
 1b,2b,3b,4b,5b,6b.....60483b
(略)
 1z,2z,3z,4z,5z,6z.....60483z
と、1300行できるイメージです。
    • good
    • 0
この回答へのお礼

早速ありがとうございます。
60483項目に対する各ファイルの値だけ取り出して、列数を増やす形(横に伸びるというか)で追加していき、一つのファイルにまとめたいです。
ファイルを添付したいのですが、再度質問し直させてください!

お礼日時:2020/03/27 14:15

No.1です



| 今いるディレクトリに1300個のフォルダがあって、そこに一つずつtxtファイルが入ってます。

ディレクトリの深さが1なら、

cat */*.txt > text.txt
    • good
    • 0
この回答へのお礼

早速ありがとうございます。
私の質問が悪くてすみません。
説明不足ですみません。
1300個の各ファイル(各サンプル)が60483の項目に対する固有の値を持っていて、その値を個々のファイルから取り出して一つのテキストファイルに結合する、という意味です。
60483×1300のテーブルになっている一つのtxtファイルをつくるということです。

お礼日時:2020/03/27 13:47

cat * > text.txt

    • good
    • 0
この回答へのお礼

早速ありがとうございます。
補足ですが、今いるディレクトリに1300個のフォルダがあって、そこに一つずつtxtファイルが入ってます。
1300個txtファイルが一つのディレクトリに入っていればcatコマンドでできるかと思うのですが、txtファイルを1つずつ取り出して1つのファイルにまとめるにはどうすれば良いでしょうか?

お礼日時:2020/03/27 13:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!