2

15 ~ 20 GB の巨大なデータ セットがあり、それはタブ区切りのファイルです。私はPythonまたはSQLでそれを行うことができますが、csvファイルの移動を避けるためにシェルスクリプトで行う方が簡単で簡単です.

たとえば、パイプ区切りのファイル入力を取得するとします。

----------------------------------------
Col1 | Col2 | Col3 | Col4 | Col5 | Col6
----------------------------------------
 A   |  H1  | 123  | abcd | a1   | b1   
----------------------------------------
 B   |  H1  | 124  | abcd | a2   | b1   
----------------------------------------
 C   |  H2  | 127  | abd  | a3   | b1   
----------------------------------------
 D   |  H1  | 128  | acd  | a4   | b1   
----------------------------------------

SQLクエリは次のようになります

SELECT Col1、Col4、Col5、Col6 FROM WHERE col2='H1'

出力:

--------------------------
Col1 | Col4 | Col5 | Col6
--------------------------
 A   | abcd | a1   | b1   
--------------------------
 B   | abcd | a2   | b1   
--------------------------
 D   | acd  | a4   | b1   
--------------------------

次に、これの Col4 のみを取り込んで、文字列の解析を行い、OutputFile1 の下に出力する必要があります。

--------------------------------
Col1 | Col4 | Col5 | Col6 | New1
--------------------------------
 A   | abcd | a1   | b1   | a,b,c,d
--------------------------------
 B   | abcd | a2   | b1   | a,b,c,d
--------------------------------
 D   | acd  | a4   | b1   | a,c,d
--------------------------------

Col4 は URL です。URL パラメータを解析する必要があります。質問を参照 -シェル スクリプトで URL パラメータを解析する方法

そして、私が持っている別のファイルがあるかどうか知りたいです

ファイル 2 :

--------------
ColA | ColB | 
--------------
 A   | abcd | 
--------------
 B   | abcd | 
--------------
 D   | qst  | 
--------------

ColB に対して同様の解析済み出力を生成する必要があります。

出力ファイル 2:

--------------
ColA | ColB | New1
--------------
 A   | abcd | a,b,c,d
--------------
 B   | abcd | a,b,c,d
--------------
 D   | qst  | q,s,t
--------------

OutputFile1 と OutputFile2 をマージする SQL クエリは、内部結合を実行します。

OutputFile1.Col1 = OutputFile2.ColA および OutputFile1.New1 = OutputFile2.New1

最終出力:

--------------------------------
Col1 | Col4 | Col5 | Col6 | New1
--------------------------------
 A   | abcd | a1   | b1   | a,b,c,d
--------------------------------
 B   | abcd | a2   | b1   | a,b,c,d
--------------------------------

同じことを実装するための提案を共有してください。

主な制約はファイルのサイズです。

ありがとう

4

2 に答える 2

3

http://open-innovation.alcatel-lucent.com/projects/unity/で、UNIX 用の「unity」という名前の非常に単純なデータベース管理プログラムを利用できます。Unity には 2 つのメイン ファイルがあります。

  1. 「foo」など、好きな名前のデータファイル、および
  2. データ ファイルと同じ基本名を持つ記述子ファイルですが、"Dfoo" のように、記述子を表す "D" がプレフィックスとして付けられます。

これらはどちらも単純なテキスト ファイルで、好きなエディターで編集できます (または、uedit という独自のデータベース対応エディターがあります)。

Dfoo は、foo の各列に 1 つの行を持ち、foo のその列に表示されるデータの属性を記述し、次の列との区切りを示します。

foo にはデータがあります。

生でユニティを使用してからしばらく経ちましたが(舞台裏でユニティを使用するスクリプトがあります)、上記の最初の表については次のとおりです。

----------------------------------------
Col1 | Col2 | Col3 | Col4 | Col5 | Col6
----------------------------------------
 A   |  H1  | 123  | abcd | a1   | b1   
----------------------------------------
 B   |  H1  | 124  | abcd | a2   | b1   
----------------------------------------
 C   |  H2  | 127  | abd  | a3   | b1   
----------------------------------------
 D   |  H1  | 128  | acd  | a4   | b1   
----------------------------------------

記述子ファイル (Dfoo) は次のようになります。

Col1 | 5c
Col2 | 6c
Col3 | 6c
Col4 | 6c
Col5 | 6c
Col6 \n 6c

データファイル (foo) は次のようになります。

A|H1|123|abcd|a1|b1
B|H1|124|abcd|a2|b1
C|H2|127|abd|a3|b1
D|H1|128|acd|a4|b1

その後、次のような Unity コマンドを実行できます。

uprint -d- foo

アンダースコアの行と記述子ファイルで指定された幅のセルで区切られた行を含むテーブルを印刷します (例: 6c = 6 文字を中央揃え、6r ​​= 6 文字を右揃え)。

uselect Col2 from foo where Col3 leq abd

Col3 の対応する値が文字列 "abd" と語彙的に等価である列 Col2 から値を選択します。

結合、マージ、挿入、削除などを実行できるユニティ コマンドがあります。基本的には、リレーショナル データベースで実行できると思われることは何でも実行できますが、すべて単純なテキスト ファイルに基づいています。

ユニティでは、各列の間に異なるセパレーターを指定できますが、すべてのセパレーターが同じ場合 (「\n」になる最後のセパレーターを除く)、 awk -F を使用するだけで、ファイルに対して awk スクリプトを実行できますセパレーター。

あなたが見ることができる他のいくつかのツールセットは、インストールが簡単かもしれませんが、おそらく unity (1970 年代から存在しています!) ほど多くの機能を持っていません。研究リストは次のとおりです。

recutils には、recutils と CSV 形式の間で変換するための rec2csv および csv2rec ツールがあることに注意してください。

于 2013-04-02T13:32:51.093 に答える
2

パイプ区切りファイルの場合:

awk '$2=="H1"{y="";x=$4;for(i=1;i<=length($4);i++)y=y?y","substr(x,i,1):substr(x,i,1);print $1,$4,$5,$6,y;}' FS="|" OFS="|" file

タブ区切りファイルの場合、FS を空のままにします。

awk '$2=="H1"{y="";x=$4;for(i=1;i<=length($4);i++)y=y?y","substr(x,i,1):substr(x,i,1);print $1,$4,$5,$6,y;}'  OFS="\t" file
于 2013-04-02T12:05:45.600 に答える