2

多くの .csv ファイルを含むディレクトリがあります。すべてのファイルの n 番目の列を列ごとに新しいファイルに抽出するにはどうすればよいですか?

例えば:

ファイル A:

111,222,333
111,222,333

ファイル B:

AAA,BBB,CCC
AAA,BBB,CCC

ファイル C:

123,456,789
456,342,122

等々...

n = 2 の場合、結果のファイルは次のようになります。

222,BBB,456,... 
222,BBB,342,...

where...は、ディレクトリ内のファイル数と同じ数の列があることを表します。

これまでの私の試み:

#!/bin/bash

for i in `find ./ -iname "*.csv"`
  do
    awk -F, '{ print $2}' < $i >> result.csv ## This would append row-wise, not column-wise.
  done

アップデート:

2 つのファイルを結合しようとしているわけではありません。特定のディレクトリに 100 個のファイルがあり、すべてのファイルの n 列目を 1 つのファイルにコピーしたいと考えています。ファイルが 2 つしかない場合のデータのあり方を示すために、例として 2 つのファイルを示しました。

コメントで指摘されているように、2 つのファイルを結合するのは簡単ですが、複数のファイルを結合するのはそれほど簡単ではないかもしれません。これが私の質問の要点です。Pythonはこの仕事をするのに役立ちますか?

4

4 に答える 4

1

トリプルのソリューションに基づいて構築された、evalを使用する一般的なバージョンは次のとおりです。

eval paste -d, $(printf "<(cut -d, -f2 %s) " *.csv)

私は eval があまり好きではありません (使用するときは常に注意してください) が、用途はあります。

于 2015-09-16T06:58:33.947 に答える
0

うーん。私の最初の考えは、外側と内側の両方のループを持つことです。外側のループは、行番号のカウンターになります。内側のループは csv ファイルを通過します。正しいフィールドを取得できるように、正しい行番号を取得するには、内側のループで head/tail を使用する必要があります。

別の方法は、現在持っている 1 つのループを使用して、各行を個別のファイルに書き込んでからマージすることです。

これらはどちらも理想的ではないようです。正直なところ、Perl でこれを行うと、メモリ内の実際のデータ構造を使用して、複雑なロジックを使用する必要がなくなります。

于 2013-04-17T02:58:14.003 に答える
0

Bash プロセスの代替が受け入れられると仮定します (つまり、Bash が利用できないシステムにソリューションを移植する必要はありません)。

paste -d, <(cut -d, -f2 file1) <(cut -d, -f2 file2) <(cut -d, -f2 file3) # etc

POSIX ソリューションでは、代わりに一時ファイルが必要です。

于 2013-04-17T04:27:00.787 に答える