awk操纵csv文件

时间:2012-05-22 19:23:36

标签: shell csv awk

我想用awk来读取csv文件。 csv文件包含5列,c1,c2,c3,c4,c5。我想判断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实现它?非常感谢。

2 个答案:

答案 0 :(得分: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}'

答案 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
            }
        }
    }'

这是凯文答案的变体。