2

awk を使用して csv ファイルを読み取りたい。csv ファイルには、c1、c2、c3、c4、c5 の 5 つの列が含まれています。データベースの制約のように、c1、c2、および c3 が一緒に一意であると判断したい。

サンプルの csv ファイルは次のとおりです。

c1,c2,c3,c4,c5
1886,5141,11-2011,62242.57,52.71
1886,5140,11-2011,63763.75,52.22
23157666,4747,11-2011,71.07,83.33
1886,5141,11-2011,4645.45,2135.45

この場合、row1 と row4 は一意の制約に違反しており、エラー メッセージが表示されます。

awkで実装するには?よろしくお願いします。

4

2 に答える 2

5
awk -F, 'line[$1,$2,$3] {printf "Error: lines %d and %d collide\n", line[$1,$2,$3], NR; next} {line[$1,$2,$3] = NR}'
于 2012-05-22T19:35:18.990 に答える
1

これにより、各複製のすべての行がリストされます。複製メッセージは、セットごとに1 回だけ出力されます。

awk -F, '{count[$1,$2,$3]++; line[$1,$2,$3] = line[$1,$2,$3] ", " NR} END {for (i in count) {if (count[i] > 1) {v=i; gsub(SUBSEP, FS, v); print "Error: lines", substr(line[i], 3), "collide on value:", v}}}'

複数の行に分割:

awk -F, '
    {
        count[$1,$2,$3]++; 
        line[$1,$2,$3] = line[$1,$2,$3] ", " NR
    }
    END {
        for (i in count) {
            if (count[i] > 1) {
                v = i;
                gsub(SUBSEP, FS, v);
                print "Error: lines", substr(line[i], 3), "collide on value:", v
            }
        }
    }'

これは、ケビンの答えのバリエーションです。

于 2012-05-22T21:26:00.547 に答える