2012-05-22 1 views
2

Я хочу использовать awk для чтения csv-файла. Файл csv содержит 5 столбцов, c1, c2, c3, c4, c5. Я хочу судить, что c1, c2 и c3 вместе уникальны, как ограничение базы данных.awk манипулирует csv-файлом

здесь пример 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? Заранее большое спасибо.

ответ

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

Это вариация на ответ Кевина.

+0

Спасибо, Деннис. Я ценю ваше время. –

+0

Привет, Деннис. Скрипт работает на моей домашней машине. Но это показывает «awk: синтаксическая ошибка около строки 1 awk: незаконный оператор рядом с линией 1 « на работе. Есть ли какая-либо awk-версия? Спасибо. –

+0

Не должно быть разницы в синтаксисе. Этот скрипт работает под 'gawk' с параметрами' --traditional' (или '--posix' или без него, поэтому он должен работать в других версиях AWK. Какие ОС/дистрибутивы вы используете и какие версии AWK? Кстати, в моем ответе есть ошибка, которая не должна быть связана с синтаксической ошибкой. Это просто неверный индекс. Я исправлю свой ответ. –

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}' 
+0

+1 Это хороший трюк. Я не знал, что это сработало. Кажется очевидным в ретроспективе. –

+0

Большое спасибо, Кевин. –

+0

Простой и красивый, так как awk-код должен быть. – Giacomo