Как удалить дублирующиеся строки в файле, не сортируя его в Unix?

Существует ли способ удалить дублирующиеся строки в файле в Unix?

Я могу сделать это с sort -u и uniq команды, но я хочу использовать sed или awk. Это возможно?

118
задан Márton Tamás 2 September 2019 в 17:47
поделиться

2 ответа

awk '!seen[$0]++' file.txt

seen - это ассоциативный массив, в который Awk будет передавать каждую строку файла. Если строки нет в массиве, то seen [$ 0] будет оцениваться как false. ! является логическим оператором НЕ и преобразует ложное в истинное. Awk напечатает строки, в которых выражение оценивается как истинное. ++ увеличивает видимый , так что видно [$ 0] == 1 после первого обнаружения строки, а затем видно [$ 0] = = 2 и т. Д.
Awk оценивает все, кроме 0 и "" (пустая строка) как истину. Если в seen помещена повторяющаяся строка, то ! Seen [$ 0] будет оцениваться как ложь, и строка не будет записана в вывод.

259
ответ дан 24 November 2019 в 01:55
поделиться

Из http://sed.sourceforge.net/sed1line.txt : (Пожалуйста, не спрашивайте меня, как это работает ;-))

 # delete duplicate, consecutive lines from a file (emulates "uniq").
 # First line in a set of duplicate lines is kept, rest are deleted.
 sed '$!N; /^\(.*\)\n\1$/!P; D'

 # delete duplicate, nonconsecutive lines from a file. Beware not to
 # overflow the buffer size of the hold space, or else use GNU sed.
 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
29
ответ дан 24 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

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