Как сохранить формат файла, если вы используете команду uniq (в командной строке)?
-
22-07-2019 - |
Вопрос
Чтобы использовать команду uniq, вы должны сначала отсортировать свой файл.
Но в имеющемся у меня файле важен порядок расположения информации, поэтому как я могу сохранить исходный формат файла, но при этом избавиться от дублирующегося содержимого?
Решение
Еще одна версия awk:
awk '!_[<*>]++' infile
Другие советы
Этот awk
сохраняет первое вхождение. Тот же алгоритм, что и в других ответах:
awk '!(sort file | uniq -d | awk '
FNR == NR { dups[<*>] }
FNR != NR && (!(<*> in dups) || !lines[<*>]++)
' - file
in lines) { print <*>; lines[<*>]; }'
Вот тот, который должен хранить только дублированные строки (в отличие от всех строк), используя awk
:
Также есть " номер строки, двойная сортировка " Метод. р>
nl -n ln | sort -u -k 2| sort -k 1n | cut -f 2-
Вы можете запустить uniq -d в отсортированной версии файла, чтобы найти дубликаты строк, а затем запустить скрипт, который говорит:
if this_line is in duplicate_lines {
if not i_have_seen[this_line] {
output this_line
i_have_seen[this_line] = true
}
} else {
output this_line
}
Используя только uniq и grep:
Создавать d.sh:
#!/bin/sh
sort $1 | uniq > $1_uniq
for line in $(cat $1); do
cat $1_uniq | grep -m1 $line >> $1_out
cat $1_uniq | grep -v $line > $1_uniq2
mv $1_uniq2 $1_uniq
done;
rm $1_uniq
Пример:
./d.sh infile
Вы можете использовать что-то ужасное O (n ^ 2), например, это (псевдокод):
file2 = EMPTY_FILE
for each line in file1:
if not line in file2:
file2.append(line)
Это потенциально довольно медленно, особенно если реализовано на уровне Bash. Но если ваши файлы достаточно короткие, они, вероятно, будут работать нормально и будут быстро реализованы ( не строка в file2
, тогда просто grep -v
и т. Д. ). р>
В противном случае вы можете, конечно, написать специальную программу, используя более продвинутую структуру данных в памяти, чтобы ускорить ее.
for line in $(sort file1 | uniq ); do
grep -n -m1 line file >>out
done;
sort -n out
сначала выполните сортировку,
для каждого уникального значения grep для первого совпадения (-m1)
и сохранить номера строк
отсортируйте вывод численно (-n) по номеру строки. Р>
вы можете удалить строку # с помощью sed или awk