У меня есть файл .csv, как это:
stack2@example.com,2009-11-27 01:05:47.893000000,example.net,127.0.0.1
overflow@example.com,2009-11-27 00:58:29.793000000,example.net,255.255.255.0
overflow@example.com,2009-11-27 00:58:29.646465785,example.net,256.255.255.0
...
Я должен удалить дубликаты электронных писем (всю строку) из файла (то есть одну из строк, содержащихся overflow@example.com
в приведенном выше примере). Как использовать uniq
только поле 1 (через запятую)? По словам man
, uniq
не имеет опций для столбцов.
Я пытался что-то с, sort | uniq
но это не работает.
man sort
). Он обозначает начальную и конечную позицию.sort
говорит страница руководство «s:„ с , проверка строгого упорядочения, без , выход только первый из равной перспективы .“ Таким образом, это действительно «первое появление дубликата перед сортировкой».-u
--unique
-c
-c
-F
устанавливает разделитель полей.$1
это первое поле._[val]
смотритval
в хеш_
(обычная переменная).++
увеличить и вернуть старое значение.!
возвращает логическое нет.источник
awk -F',' '{ x[$1]=$0 } END { for (i in x) print x[i] }' file
!_[$1][$2]++
можно использовать сортировку по первым двум полям. Однако мойawk
-фу недостаточно силен, чтобы иметь возможность уникальности в разных областях. :(Рассмотреть несколько столбцов.
Сортировать и дать уникальный список на основе столбца 1 и столбца 3:
-t :
двоеточие является разделителем-k 1,1 -k 3,3
на основе столбца 1 и столбца 3источник
или если вы хотите использовать Uniq:
<mycvs.cvs tr -s ',' ' ' | awk '{print $3" "$2" "$1}' | uniq -c -f2
дает:
источник
cat
! Вместо того, чтобы отправлять сообщения в tr, просто позвольте tr прочитать файл, используя<
. Пропускание трубcat
является распространенным ненужным осложнением, используемым новичками. Для больших объемов данных есть эффект производительности.rev
.Если вы хотите сохранить последний из дубликатов, которые вы можете использовать
Что было моим требованием
Вот
tac
перевернет файл построчноисточник
Вот очень изящный способ.
Сначала отформатируйте содержимое так, чтобы столбец, который нужно сравнить по уникальности, имел фиксированную ширину. Один из способов сделать это - использовать awk printf со спецификатором ширины поля / столбца ("% 15s").
Теперь параметры uniq -f и -w можно использовать для пропуска предыдущих полей / столбцов и для указания ширины сравнения (ширины столбцов).
Вот три примера.
В первом примере ...
1) Временно сделайте столбец интереса фиксированной шириной, большей или равной максимальной ширине поля.
2) Используйте параметр -f uniq, чтобы пропустить предыдущие столбцы, и используйте параметр -w uniq, чтобы ограничить ширину до tmp_fixed_width.
3) Удалите конечные пробелы из столбца, чтобы «восстановить» его ширину (при условии, что предварительно не было конечных пробелов).
Во втором примере ...
Создайте новый столбец uniq 1. Затем удалите его после применения фильтра uniq.
Третий пример такой же, как второй, но для нескольких столбцов.
источник
ну, проще, чем изолировать столбец с помощью awk, если вам нужно удалить все с определенным значением для данного файла, почему бы просто не выполнить grep -v:
например, удалить все со значением «col2» во второй строке: col1, col2, col3, col4
Если это не достаточно хорошо, потому что некоторые строки могут быть неправильно удалены из-за возможного появления соответствующего значения в другом столбце, вы можете сделать что-то вроде этого:
awk для выделения ошибочного столбца: например
-F устанавливает поле, разделенное на «,», $ 2 означает столбец 2, за которым следует некоторый пользовательский разделитель, а затем вся строка. Затем вы можете отфильтровать, удалив строки, начинающиеся с ошибочного значения:
а затем раздеть вещи перед разделителем:
(обратите внимание, что команда sed неаккуратная, потому что она не содержит экранирующих значений. Также шаблон sed должен быть что-то вроде «[^ |] +» (т. е. что-либо, кроме разделителя). Но, надеюсь, это достаточно ясно.
источник
После сортировки файла
sort
сначала вы можете применитьuniq
.Кажется, что файл отсортирован просто отлично:
Вы также можете сделать немного волшебства AWK:
источник
sort
, тогдаuniq
,sort
должно быть сделано, прежде чем делатьuniq
иначе, это не работает (но вы можете пропустить вторую команду и просто использоватьsort -u
). Fromuniq(1)
: «Фильтровать соседние совпадающие строки из INPUT (или стандартного ввода), записывая в OUTPUT (или стандартный вывод)».