удаление дублирования из выходных столбцов

Другой превосходный инструмент для двунаправленной синхронизации..... freefilesync

5
18.11.2013, 23:50
3 ответа
doit () 
{ 
    awk '{
           key=$1<=$2? $1 FS $2 : $2 FS $1; 
           if (!seen[key]) print $1,$2
           seen[key]=1
    }'
}
$ doit <test
A B
A C
A D
B C
$

(или, становясь более кратким с ним, потому что ответ Chris Down, настолько сладкий)

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++ {print $1,$2}'

который мог быть далее уменьшен, если Вы не заботитесь о пробелах в Ваших данных

awk '!seen[$1<=$2? $1 FS $2: $2 FS $1]++'

)

FS переменная "разделителя полей" awk, используемый здесь для гарантирования нерушимость границ между полями ключа будет правильно определен. Мой оригинал сделал, чтобы они работали вместе, $1$2, то, на которое, поскольку указал Stephane Chazelas, будет рассматривать A BC и AB C как дубликаты.

7
27.01.2020, 20:33
  • 1
    Хороший. Сделайте Вы хотите добавить explanantion того, что продолжается там для тех из использования, кто желает узнать больше awk? –  jasonwryan 18.11.2013, 19:28
  • 2
    @jasonwryan, Добавляющий примечание о FS использование теперь, там что-либо еще? –  jthill 18.11.2013, 19:38
  • 3
    , необходимо любить awk..., обычно предоставляет четкий и краткий ответ на повседневные проблемы. Хороший, jthill. Я предпочитаю главную версию, поскольку это намного более ясно (мне, так или иначе), чем более краткие, на первый взгляд –  Olivier Dulac 18.11.2013, 22:00
  • 4
    @OlivierDulac Спасибо. Да, жемчуг имеет, лучше достигают, это даже не конкурс, но awk таким образом легкодоступен для non-career-IT парней, это - мое дежурное. –  jthill 18.11.2013, 22:11
  • 5
    @jthill: радуйтесь :) swtch.com/~rsc/regexp/regexp1.html (но это, возможно, изменилось с тех пор... в противном случае awk, и regexp grep мог быть очень хорошей вещью по сравнению с Perl... Но я предполагаю, что существуют пакеты (или новые версии?) с тем же подходом в жемчуге?). Вне темы здесь, но я просто узнал об этом, и это заставило awk сиять снова ^^ –  Olivier Dulac 18.11.2013, 22:19

В Perl:

perl -lane 'print if !$seen{join(" ", sort @F)}++'

Это работает путем сортировки и присоединения к полям (таким образом, "C" стал бы ключевым "C"), и добавление их к $seen. Это только распечатает первое вхождение, потому что условное предложение только будет верно, когда это оценит для обнуления (который только произойдет в первый раз, когда с этим сравнением встречаются, из-за постинкремента).

5
27.01.2020, 20:33

Если Вы не хотите сохранить порядок элементов на уникальной строке, то можно отсортировать каждую строку, то вид строки и удаляет дубликаты.

awk '{ if ($2 < $1) print $2, $1; else print $1, $2; }' | sort -u
2
27.01.2020, 20:33

Теги

Похожие вопросы