csvファイルをルックアップ列1と比較し、列2の値を確認します。

csvファイルをルックアップ列1と比較し、列2の値を確認します。

さて、私が何をすべきかを説明しようとします。デフォルトでは、次の例に示すように2つのCSVファイルがあります。

ファイル1:

Column 1, Column 2
abc     , 123
def     , 234
adf     , 567

ファイル2

Column 1, Column 2
abc     , 123
def     , 234
adf     , 578

次の手順を実行するには、シェルスクリプトまたは単純なコマンドを作成する必要があります。

  1. 列1に基づいて2つのファイルを並べ替える
  2. 以下を 1 行ずつ実行します。
    • ファイル1の列1を使用して、ファイル2の列1から値を取得します。
      1. 見つかった場合は、ファイル1の列2の値をファイル2の列2の値と比較します。
      2. 一致する場合は、列1、2、および3に「確認済み」と書いてファイルを分割します。
      3. 一致するものがない場合は、列1、列2、および「失敗」をファイルごとに作成します。

これにより、2 つの出力ファイルが生成されます。最初のファイルには一致する列 1 と 2 で見つかったすべての項目が含まれ、2 番目のファイルには失敗した列 1 検索または見つかった列 1 が含まれますが、列 2 の位置には一致がないため、デフォルトでは列 1 をキーとして使用します.します。 2列を確認してください。

ベストアンサー1

次の入力ファイルが与えられた場合:

$ cat in1 in2
Column 1, Column 2
abc     , 123
def     , 234
adf     , 567
Column 1, Column 2
abc     , 123
def     , 234
adf     , 578

まず、それらをソートしてから単一のファイルにリンクできます。

$ sort in1 > in1.sorted; sort in2 > in2.sorted; paste in{1,2}.sorted
Column 1, Column 2  Column 1, Column 2
abc     , 123   abc     , 123
adf     , 567   adf     , 578
def     , 234   def     , 234

awkここではコンマが役に立ちますが、最初にコンマを削除する必要がありますsed

$ paste in{1,2}.sorted | sed s/,//g
Column 1 Column 2   Column 1 Column 2
abc      123    abc      123
adf      567    adf      578
def      234    def      234

その後、次のようにすばやくダンプできますawk

$ paste in{1,2}.sorted | sed s/,//g | awk '$2 == $4 {print $1,"Validated"}; $2 != $4 { print $1,"Failed"}'
Column Failed
abc Validated
adf Failed
def Validated

これはrawを使って行うこともできますawk。ヘッダー行を削除することができ、同じ順序で同じデータに依存しないため、ソートする必要がないという利点があります。

$ awk 'FNR != 1 && NR == FNR {data[$1]=$3} FNR != 1 && NR != FNR {if(data[$1]==$3) {print $1, "Validated"} else {print $1, "Failed"} }' in{1,2}
abc Validated
adf Failed
def Validated

これはいくつかの魔法のawk組み込み変数とそれに関連するトリックに依存します。

  • NR- 処理されたレコードの総数
  • FNR- 総レコード数現在のファイルに扱う
  • FNR != 1- 各ファイルの最初の行をスキップします。 (ヘッダーはデータとして処理されません。)
  • NR != FNR- 最初のファイルを完全に読み込み、その後のファイルを読み始めた後にのみ実行されます。これにより、data2番目のファイルを噛み始めると、テスト用の配列を事前に埋めることができます。

おすすめ記事