1

2 つの CSV ファイルがあり、AWK を使用してそれらを比較し、新しいファイルを生成したいと考えています。

ファイル1.csv:

"no","loc" 
"abc121","C:/pro/in" 
"abc122","C:/pro/abc"
"abc123","C:/pro/xyz"
"abc124","C:/pro/in" 

file2.csv:

"no","loc" 
"abc121","C:/pro/in"
"abc122","C:/pro/abc"
"abc125","C:/pro/xyz"
"abc126","C:/pro/in" 

出力.csv:

"file1","file2","Diff" 
"abc121","abc121","Match" 
"abc122","abc122","Match" 
"abc123","","Unmatch" 
"abc124","","Unmatch" 
"","abc125","Unmatch" 
"","abc126","Unmatch"
4

2 に答える 2

1

片道awk:

script.awk:

BEGIN {
    FS = ","
}

NR>1 && NR==FNR {
    a[$1] = $2
    next
}

FNR>1 { 
    print ($1 in a) ? $1 FS $1 FS "Match" : "\"\"" FS $1 FS "Unmatch"
    delete a[$1] 
}

END {
    for (x in a) {
        print x FS "\"\"" FS "Unmatch"
    }
}

出力:

$ awk -f script.awk file1.csv file2.csv
"abc121","abc121",Match
"abc122","abc122",Match
"","abc125",Unmatch
"","abc126",Unmatch
"abc124","",Unmatch
"abc123","",Unmatch
于 2013-06-10T05:56:36.337 に答える
0

私は単独で使用しませんでしawkたが、あなたが正しく求めていることの要点を理解していれば、この長いワンライナーでそれを行うべきだと思います...

join -t, -a 1 -a 2 -o 1.1 2.1 1.2 2.2 file1.csv file2.csv | awk -F, '{ if ( $3 == $4 ) var = "\"Match\""; else var = "\"Unmatch\"" ; print $1","$2","var }' | sed -e '1d' -e 's/^,/"",/' -e 's/,$/,"" /' -e 's/,,/,"",/g'

説明:

  • このjoin部分は 2 つの CSV ファイルを取得し、それらを最初の列で結合し ( のデフォルト動作join)、4 つのフィールドすべてを出力し ( -o 1.1 2.1 1.2 2.2)、両方のファイルで一致しない行が含まれていることを確認します ( -a 1 -a 2)。
  • その部分はその出力を取得し、実際に一致するかどうかに基づいてawk、3 番目と 4 番目の列の組み合わせを or に置き換えます。あなたの例に基づいて、この動作について仮定する必要がありました。 "Match""Unmatch"
  • このsed部分は、出力から "no","loc" ヘッダーを削除し ( -e '1d')、空のフィールドを開閉引用符で置き換えます ( -e 's/^,/"",/' -e 's/,$/,""/' -e 's/,,/,"",/g')。この最後の部分は必要ないかもしれません。

編集: tripleee が指摘するように、2 つの初期ファイルがソートされていない場合、上記は失敗します。これを修正するための更新されたコマンドを次に示します。ヘッダー行をパントし、各ファイルを並べ替えてから結合します...

join -t, -a 1 -a 2 -o 1.1 2.1 1.2 2.2 <( sed 1d file1.csv | sort ) <( sed 1d file2.csv | sort ) | awk -F, '{ if ( $3 == $4 ) var = "\"Match\""; else var = "\"Unmatch\"" ; print $1","$2","var }' | sed -e 's/^,/"",/' -e 's/,$/,""/' -e 's/,,/,"",/g'
于 2012-09-12T19:31:38.427 に答える