質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

2回答

2766閲覧

pasteでディレクトリ内の全てのtxtファイルを結合

iziz

総合スコア8

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2020/03/28 04:52

ディレクトリ内に1300個のtxtファイルが入っています。
全てのtxtファイルを列方向につなげて一つのtxtファイルにしたいです。
pasteを使えば複数のファイルを列方向に結合できますが、1300個を一括で結合できる方法はありますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

paste *.txtでいいのでは?
ファイルの順番はファイル名を辞書順でソートした順になります。

1.txt 2.txt 10.txtのようなネーミングなら、
paste ?.txt ??.txt ???.txt ????.txt
とか、
paste $(ls -v) (数字順ソート)
とか。

「こういうファイル名体系で、こういう順で連結したい」というのが上記以外なら、補足して下さい。

#追記
同時ファイル数オープンの上限の回避で、1回1000を上限にpasteする。

Bash

1rm -f *.wk 2ls -1 *.txt | xargs -n 1000 sh -c 'paste > $$.wk $*' sh 3paste *.wk > output 4rm *.wk

投稿2020/03/28 07:26

編集2020/03/28 11:16
otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iziz

2020/03/28 10:44

ありがとうございます。順番はなんでも大丈夫です。 頂いたコマンドで確かにいけそうなんですが、too many open filesというエラーで1000個めくらいで終わってしまいます。多すぎる場合はどうすれば良いのでしょうか?
otn

2020/03/28 11:13

ああ、失礼しました。openファイル数は1024上限だと思います。 なるほど。 では、KojiDoiさんの回答のように分割して行う必要がありますね。
iziz

2020/03/28 11:16

なるほど、でも1024未満ならこの方法でサクッとできるわけですね。勉強になりました!またよろしくお願いいたします。
otn

2020/03/28 11:19

標準入力、出力、エラー出力があるので、入力は1021になるはずです。
iziz

2020/03/28 11:45

paste: sample_1021.txt: Too many open files と表示されてるので、おっしゃる通りでした。 補足もありがとうございます。Linux初心者なので色々お聞きしたいのですが、ls -vというコマンドはどういう指示になるのでしょうか?
otn

2020/03/28 12:03

1 ~ 20 の数字のファイルがあるとして、ls だと 1 10 11 ~ 18 19 2 20 3 4 5 6 7 8 9 の順になります。辞書順です(あ、ああ、あい、~~、あん、い、いあ、~~~)。 ls -v だと数字の順になります。v は version の v 。ファイル名にバージョン番号が付いていることはよくあるので。
iziz

2020/03/28 12:09

ありがとうございます。 paste $(ls -v)は、ディレクトリにある全てのファイルに対して実行されるのでしょうか? どこにもtxtとか指定していないということは、そういうことなのかと思い。
otn

2020/03/30 22:44

ああ、そうですね。書き漏れです。ls -v *.txt
guest

0

ベストアンサー

方法はありますか?

bashのforループを使えばできます。ちゃんとテストしていませんが、たぶん次のような感じで。

filelist=(`ls -v`) cp ${filelist[0]} out.txt for a in ${filelist[@]:1}; do paste out.txt $a > out0.txt mv out0.txt out.txt done

投稿2020/03/28 06:04

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iziz

2020/03/28 10:50

ありがとうございます。 bashでfor文使ったことないので、各行の意味を教えて頂けないでしょうか? 何となくは分かるのですが。 あと、これはbash上に直接入力するコマンドでしょうか?スクリプトではなくて。
KojiDoi

2020/03/28 10:53

コマンドラインで入力できないことはないですが、まあ普通はスクリプトファイルにしますね。 filelistはbashの「配列」です。詳しいことはマニュアルを見てください。
iziz

2020/03/28 11:53

filelistにtxtファイル全部を配列として与えて、一つ目のファイルfililist[0]をout.txtとして出力して、for文使って二つ目以降のファイルを'a'として取り出して、pasteでout.txtと結合して、out0.txtで保存。次にout.txtの中身をout0.txtで上書きする。これを最後のファイルまで繰り返して、最終的に全ファイルが結合したファイルにするという感じの動作ですか?
iziz

2020/03/28 11:55 編集

ファイル名を連番に変えて、pythonでこういうコード書いてもうまくいきそうなんですが、原理はたぶん同じですよね? import pandas as pd df_base = pd.read_table('sample_001.txt',header=None,index_col=0) for n in range (2,1358):  df = pd.read_table(f'sample_{n:03}.txt', index_col=0,header=None)  df_joined = pd.concat([df_base,df],axis=1)  df_base = df_joined df_base.to_csv('all_FPKMs_merged.txt',sep='\t')
KojiDoi

2020/03/28 13:44

そのとおりです。 ファイル数が少ないなら、otnさんが最初に示したような方法でもいいですが、ファイルのオープン数上限があるし、スクリプトファイルではなくコマンドラインでの操作となると、今度はコマンドラインの文字数の上限に引っかかる可能性を懸念しなくてはなりません。
iziz

2020/03/28 14:20

良くわかりました、勉強になりました、ありがとうございます! 余談ですが、KojiさんもBiologyをやられてるんですね。 僕も今Bioiformaticsを勉強していて、今はTCGAのRNA seqのデータをDLして、そのデータを整理している状況です。これからPCAとかtSNEとかやってみようと思っています。 また色々教えて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問