С помощью команды linux sort -f | uniq -i вместе для игнорирования регистра

Я пытаюсь найти уникальные и повторяющиеся данные в списке данных с двумя столбцами. Я действительно просто хочу сравнить данные в столбце 1.

Данные могут выглядеть так (разделенные табуляцией):

What are you doing?     Che cosa stai facendo?
WHAT ARE YOU DOING?     Che diavolo stai facendo?
what are you doing?     Qual è il tuo problema amico?

Итак, я играл со следующим:

  1. Сортировка без учета регистра (просто "сортировать", без опции -f) дает мне меньше дубликатов

    gawk '{ FS = "\t" ; print $1 }' EN-IT_Corpus.txt | сортировать | uniq -i -D > дубликаты

  2. Сортировка с игнорированием регистра ("sort -f") дает мне больше дубликатов

    gawk '{ FS = "\t" ; print $1 }' EN-IT_Corpus.txt | сортировать -f | uniq -i -D > дубликаты

Правильно ли я думаю, что № 2 более точен, если я хочу найти дубликаты без учета регистра, потому что он сначала сортирует его, игнорируя регистр, а затем находит дубликаты на основе отсортированных данных?

Насколько я знаю, я не могу комбинировать команды sort и unique, потому что у sort нет возможности отображать дубликаты.

Спасибо, Стив


person Steve3p0    schedule 23.02.2013    source источник
comment
Каковы результаты, которые вы хотите получить от ваших выборочных данных?   -  person Jonathan Leffler    schedule 23.02.2013


Ответы (3)


Вы можете сделать это просто:

sort -uf
#where sort -u = the unique findings
#      sort -f = insensitive case
person stefansson    schedule 09.11.2018
comment
Я удивлен, что никто не подумал об этом за 5 лет;) - person quant; 09.11.2018

Я думаю, что ключ к предварительной обработке данных:

file="EN-IT_Corpus.txt"
dups="dupes.$$"
sed 's/        .*//' $file | sort -f | uniq -i -D > $dups
fgrep -i -f $dups $file

Команда sed генерирует только английские слова; они сортируются без учета регистра, а затем выполняются uniq без учета регистра, печатая только повторяющиеся записи. Затем снова обработайте файл данных, ища дублированные ключи с fgrep или grep -F, указав шаблоны для поиска в файле -f $dups. Очевидно (я надеюсь), что большой пробел в команде sed — это табуляция; вы можете написать \t в зависимости от вашей оболочки и sed и так далее.

На самом деле с GNU grep вы можете сделать:

sed 's/        .*//' $file |
sort -f |
uniq -i -D |
fgrep -i -f - $file

И если количество дубликатов действительно велико, вы можете сжать их с помощью:

sed 's/        .*//' $file |
sort -f |
uniq -i -D |
sort -f -u |
fgrep -i -f - $file

Учитывая входные данные:

What a surprise?        Vous etes surpris?
What are you doing?        Che cosa stai facendo?
WHAT ARE YOU DOING?        Che diavolo stai facendo?
Provacation         Provacatore
what are you doing?        Qual è il tuo problema amico?
Ambiguous        Ambiguere

вывод из всего этого:

What are you doing?        Che cosa stai facendo?
WHAT ARE YOU DOING?        Che diavolo stai facendo?
what are you doing?        Qual è il tuo problema amico?
person Jonathan Leffler    schedule 23.02.2013

или это:

уникальный:

awk '!arr[tolower($1)]++'  inputfile > unique.txt

дубликаты

awk '{arr[tolower($1)]++; next} 
END{for (i in arr {if(arr[i]>1){print i, "count:", arr[i]}} }' inputfile > dup.txt
person jim mcnamara    schedule 23.02.2013