LinuxForum.Fans
Тема

Удаление дубликатов строк из файла

Автор: vovanvster 13 сообщений 6021 просмотров
#332115

Здравствуйте.
Существует небольшой текстовый файл в котором попадаются строки c одинаковым текстом но разным количеством пробелов в этих строках. То есть строго говоря они не одинаковые, но несут для пользователя одну и ту же информацию.
Можно ли удалить повторения оставив по одной (любой) строке ?
Сейчас для этого приходится удалять все пробелы и файл становится плохо читаемым.

#332129
"vovanvster⇓" написал:
Сейчас для этого приходится удалять все пробелы и файл становится плохо читаемым.

Замените подряд идущие пробелы одним.

text
sed 's/[\ ][\ ]*/\ /g;s/[\ ]$//g' test.txt
#332190

Как-то так...

text

#!/usr/bin/env python
#_*_ coding: utf-8 _*_

with open('file.txt', 'r') as f: lines = f.readlines() l = [] with open('file.txt', 'w') as f: for line in lines: x = line.split() if x not in l: f.write(line) l.append(x)

ЗЫ. Не проверял, перед использованием сделать резервную копию.

#332251
Lupo Alberto написал:

Замените подряд идущие пробелы одним.
text
sed 's/[\ ][\ ]*/\ /g;s/[\ ]$//g' test.txt

Спасибо, изящное решение. Почему я сам не догадался ?

#332253
"vovanvster⇓" написал:
Спасибо, изящное решение.

Увы, это не изящно...

#332254

-=Serj=-, Спасибо но чё-та я не готов сюда python вмешивать. Тут большой скрипт на баше и не стоит в середине скрипта python вызывать. Тогда уж изначально на питоне писать надо.

#332256
Lupo Alberto написал:
[quote="vovanvster⇓"]Спасибо, изящное решение.

Увы, это не изящно...[/quote]
Имел ввиду не sed а саму идею привести строки к подобному виду для облегчения обработки.

#332260
"vovanvster⇓" написал:
Имел ввиду не sed а саму идею привести строки к подобному виду для облегчения обработки.

Кстати, изящнее, чем sed с этой задачей врядли какая программа справится ;)

#332269
Lupo Alberto написал:

Кстати, изящнее, чем sed с этой задачей врядли какая программа справится ;)

awk ?

#332290
"vovanvster⇓" написал:
awk ?

Не думаю, что получится «изящнее» — awk всё же предназначен для другого.

#333051

tr с опцией "-s" это делает:

text
tr -s " " " " <input_file

Пётр.

#337467

Поясните мысль. Не делает.

#337499
vovanvster написал:
Поясните мысль. Не делает.

Виноват, поспешил, эта команда только заменяет несколько пробелов одним.
Тогда строки с одинаковым текстом будут иметь также и одинаковое
количество пробелов, т.е. будут совпадать и их проще будет выявить.

Пётр.

Войдите или зарегистрируйтесь, чтобы ответить.