さて、私が何をすべきかを説明しようとします。デフォルトでは、次の例に示すように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に基づいて2つのファイルを並べ替える
- 以下を 1 行ずつ実行します。
- ファイル1の列1を使用して、ファイル2の列1から値を取得します。
- 見つかった場合は、ファイル1の列2の値をファイル2の列2の値と比較します。
- 一致する場合は、列1、2、および3に「確認済み」と書いてファイルを分割します。
- 一致するものがない場合は、列1、列2、および「失敗」をファイルごとに作成します。
- ファイル1の列1を使用して、ファイル2の列1から値を取得します。
これにより、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
- 最初のファイルを完全に読み込み、その後のファイルを読み始めた後にのみ実行されます。これにより、data
2番目のファイルを噛み始めると、テスト用の配列を事前に埋めることができます。