-2

3 つの異なる CSV ファイルがあります。フォーマットは次のとおりです。

domain1.csv

name1,lastname1
name2,lastname2
name3,lastname3

domain2.csv

name1,lastname1
name6,lastname6
name3,lastname3

domain3.csv

name1,lastname1
name4,lastname4
name3,lastname3

この3つのファイルに基づいて、このようなレポートを作成する必要があります

name,lastname,domain1,domain2,domain3
name1,lastname1,yes,yes,yes
name2,lastname2,yes,no,no
name3,lastname3,yes,yes,yes
name4,lastname4,no,no,yes
name6,lastname6,no,yes,no

基本的に、このレポートは、各ファイルの行を 1 つずつ読み取り、他の 2 つのファイルでその行を見つけ、名前と姓の列を照合してレポートを作成できるスクリプトを使用する場合にのみ可能です。しかし、私はシェルスクリプトの初心者です。誰かが私を助けることができますか?私はバッシュを使用しています。

4

3 に答える 3

1

awkほとんどの Unix ライクなオペレーティング システムに標準装備されているミニ言語であり、この種の問題にかなり簡単に取り組むことができます。

awk '{ names[$0] = (names[$0] "," FILENAME) }
     END { print "name,lastname,domain1,domain2,domain3"
           for( elt in names ) {
             printf "%s,%s,%s,%s\n", elt,
                                     index( names[elt], "domain1.csv" ) ? "yes" : "no",
                                     index( names[elt], "domain2.csv" ) ? "yes" : "no",
                                     index( names[elt], "domain3.csv" ) ? "yes" : "no"
           }
         }' domain*.csv | sort

上記のスクリプトは、各ファイルを 1 行ずつ解析しnameN,lastnameN、インデックスとして使用して連想配列を作成し、ファイルが含まれている (コンマで区切られた) ファイル名を値として使用します。次に、連想配列をループして、配列の値に各ファイル名が含まれているかどうかに応じて、各インデックスの後に「はい」または「いいえ」の文字列を出力します。

于 2013-07-04T02:06:53.870 に答える
0

およびをjoin含むコマンドはsortsed必要な主要なツールです。:元のデータには表示されないと仮定します。ファイル内の行の存在を記録するには、ファイル内にyesフィールドが必要です。一致しない場合はjoin供給します。noのプロセス置換を使用bashすると、次のように記述できます。

$ sed 's/$/:yes/' domain1.csv | sort |
> join -t: -a 1 -a 2 -e no -o 0,1.2,2.2     - <(sed s'/$/:yes/' domain2.csv | sort) |
> join -t: -a 1 -a 2 -e no -o 0,1.2,1.3,2.2 - <(sed 's/$/:yes/' domain3.csv | sort) |
> sed 's/:/,/g'
name1,lastname1,yes,yes,yes
name2,lastname2,yes,no,no
name3,lastname3,yes,yes,yes
name4,lastname4,no,no,yes
name6,lastname6,no,yes,no
$

sedとのsort組み合わせ (3 回) は、:yesをファイルに追加し、名前を並べ替えます。結合はほぼ対称です。は-t:、フィールド区切り文字がコロンであることを指定します。-a 1and-a 2は、ファイルに一致するものがない場合でも、その行が出力に含まれることを意味します。これ-e noは、ファイルに一致するものがない場合no、出力に a が生成されることを意味します。-oオプションは出力列を指定します。最初の結合の場合-o 0,1.2,2.2、出力は結合列 ( 0)、次にyes2 つのファイルからの 2 番目の列 ( ) です。2 番目の結合では、入力に 3 つの列があるため、 が指定されます-o 0,1.2,1.3,2.2。引数-自体は、「標準入力を読み取る」ことを意味します。の<(...)表記は「プロセス置換」であり、ファイル名 (通常は/dev/fd/NN) がコマンドに提供されjoin、括弧内にコマンドの出力が含まれます。次に、出力をsedもう一度フィルタリングしてコロンをコンマに置き換え、目的の出力を生成します。

于 2013-07-04T01:52:35.953 に答える