2016-02-25 3 views
1

Что такое умный и простой способ удаления обманов (не обязательно последовательных) в разделенных элементах строки.Как удалить обманки в строках разделительного текста

ДО:

apple,banana,apple,cherry,cherry 
delta,epsilon,delta,epsilon 
apple pie,delta,delta 

после:

apple,banana,cherry 
delta,epsilon 
apple pie,delta 

должны работать на Mac. Разрешить юникод. Любой метод оболочки/язык/команда. Дюпы не обязательно последовательны.

Примечание: этот вопрос является разновидностью How to remove dupes from blocks of text - который предназначен для блоков текста, разделенных пустыми линиями.

+0

Каждый раз, когда вы публикуете вопрос «как удалить дубликаты», вы должны включить случай, когда одно слово является подстрокой другого в образце ввода, например. «яблоко, ананас», потому что чаще всего люди, пишущие решения, не будут рассматривать этот случай, если его конкретная часть вопроса. Кроме того, если присутствуют RE-метахаракты, например, '.',' * ','? 'и т. д., тогда они также включают в себя так же, как люди часто предлагают regexp-based вместо строковых решений, и это намного сложнее, чтобы получить право, когда RE-метамарки могут присутствовать. –

ответ

1
awk -F, '{ for(i=1;i<=NF;i++) if(split($0,t,$i)>2) sub($i",","") }1' file    
banana,apple,cherry 
delta,epsilon 
apple pie,delta 

СЕПГ версия:

sed -r 's/(.+)(.*),\1/\1\2,/g;s/,$//' file 
apple,banana,cherry 
delta,epsilon 
apple pie,delta 

Просто код.

+0

wrt the awk version: попробуйте, если у вас есть как яблоко, так и ананас, каждый раз появляется один раз в одной строке, и вы обнаружите, что он удаляет яблоко или усекает ананас до сосновой, в зависимости от их порядка на линии. Вам нужно будет добавить границы слова gawk-specific (которые будут работать только в том случае, если символы в каждом поле являются составными для word) или некоторые другие разделители, а затем все равно будут терпеть неудачу, если какой-либо метасимвол регулярного выражения появится в поле. Он также не выводит результат в желаемом порядке, поскольку он удаляет первые вхождения каждой строки, а не последующих. У sed есть некоторые подобные проблемы. –

1
$ awk 'BEGIN { FS=OFS="," } 
{ 
    delete seen 
    sep="" 
    for (i=1;i<=NF;i++) { 
     if (!seen[$i]++) { 
      printf "%s%s", sep, $i 
      sep = OFS 
     } 
    } 
    print "" 
}' file 
apple,banana,cherry 
delta,epsilon 
apple pie,delta 
+0

Нет ни одного лайнера? Я полагаю, что это может быть однострочный проход через tr до/после. –

+0

Скрипт Эд Мортон в одной строке 'awk -v OFS =", "-F", "'{delete seen; Сентябрь = ""; для {i = 1; i <= NF; i ++) {if (! seen [$ i] ++) {printf "% s% s", sep, $ i; sep = OFS} print ""} 'file' – Firefly

+0

Вы всегда можете вставить любой скрипт awk в одну строку, добавив в конце каждой строки полуколонны, которые не заканчиваются на '{' или '}', но по моему опыту что создает неразборчивый беспорядок для нулевой выгоды. –

Смежные вопросы