2

このような重複行のあるファイルがありますが、最後のフィールドのみが異なります。

OST,0202000070,01-AUG-09,002735,6,0,0202000068,4520688,-1,0,0,0,0,0,55
ONE,0208076826,01-AUG-09,002332,316,3481.055935,0204330827,29150,200,0,0,0,0,0,5
ONE,0208076826,01-AUG-09,002332,316,3481.055935,0204330827,29150,200,0,0,0,0,0,55
OST,0202000068,01-AUG-09,003019,6,0,0202000071,4520690,-1,0,0,0,0,0,55

最初の行を削除して、2番目の行を残す必要があります。

私はもう試した:

awk '!x[$0]++ {getline; print $0}' file.csv

ただし、重複していない行も削除されるため、意図したとおりに機能しません。

4

3 に答える 3

2
#!/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]+$/))
    if (!seen[s]) {
        print $0
        seen[s] = 1
    }
}
于 2009-10-19T17:19:40.223 に答える
1

ほぼ重複しているものが常に隣接している場合は、前のエントリと比較するだけで、潜在的に巨大な連想配列を作成することを回避できます。

#!/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]*$/))
    if (s != prev) {
        print prev0
    }
    prev = s
    prev0 = $0
} 
END {
    print $0
}

編集:スクリプトを変更して、ほぼ重複したグループの最後のスクリプトを印刷するようにしました(tac不要)。

于 2009-10-19T18:02:06.127 に答える
1

一般的な戦略として(Ahoでクラスを受講しているにもかかわらず、私はAWKのプロではありません)、次のことを試してみてください。

  1. 最後を除くすべてのフィールドを連結します。
  2. この文字列をハッシュのキーとして使用します。
  3. 行全体を値としてハッシュに格納します。
  4. すべての行を処理したら、ハッシュをループして値を出力します。

これはAWK固有のものではなく、サンプルコードを簡単に提供することはできませんが、これを最初に試します。

于 2009-10-19T17:04:26.653 に答える