0

私が使用しているデータ ベンダーにはバグがあり、修正に時間がかかっています。

以下は、私が受け取った csv ファイルの簡略版です。

# cat new_data20130904.csv
a,001,b,c,d
e,002,f,g,h
e,003,f,g,h
i,004,j,k,l

行 2 と行 3 の列 2 は一意ですが、データは同じです。

行 3 はベンダーによって作成されるべきではありませんでした。バグはベンダーによって認識されており、修正が約束されていますが、すぐには期待できません。

次のようになるように、CSV ファイルを解析して変更する必要があります。

a,001,b,c,d
e,002,f,g,h
i,004,j,k,l

これらの誤って重複する行を削除する防御的なコードを作成したいと思います。

理想的には、Ubuntu/Debian ビルトインを使用したいと思います。

最初は、2 番目のフィールドを削除して uniq を実行するのが良いスタートになると思いました。

# cut -d, -f1,3- new_data20130904.csv | uniq
a,b,c,d
e,f,g,h
i,j,k,l

しかし、今は列 2 を元に戻す方法が思いつかないので、これは役に立たないと思います。

4

2 に答える 2

1

これはどうですか?

$ awk -F, '{if (a[$1]) next}a[$1]=$0' file
a,001,b,c,d
e,002,f,g,h
i,004,j,k,l

説明

最初の列を配列に格納します。すでに配列にある場合は、レコードをスキップします。

  • -F,フィールド区切り文字をカンマに設定します,
  • {if (a[$1]) next}最初のフィールドがすでに配列にある場合はスキップします。
  • a[$1]=$0最初のフィールドを配列のキーとして保存しa、行を出力します (print $0これは awk のデフォルトの動作であるため、書き込む必要はありません)。

そして、無視する必要があるのがn番目の列である場合、どうすればそれを微調整できますか?

を置き換えることができa[$1]ますa[$n]nは列です。

于 2013-09-04T10:37:46.283 に答える