LinuxForum.Fans
Тема

Сортировка файла

Автор: l_cho 18 сообщений 5098 просмотров
#285079

Добрый день имеется два файла , file1 file2 , содержание :
file1 file2
1 2
2 1

Нужно чтобы скрипт удалил повторяющиеся строки , а соответственно файл должен остаться пустым.
такой вариант не помог так как строки идут рекурсивно cat list-1 list-2 list-3 | sort | uniq > final.list
и еще кучу примеров смотрел даже добрался до цикла в цикле со считыванием построчно строк но это все грабли. Так что прошу помощи

#285080
"l_cho" написал:
Нужно чтобы скрипт удалил повторяющиеся строки , а соответственно файл должен остаться пустым.

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

#285083

изначально существует получить
file1 file2 file3
1 2 3
2 1
3
Идея такова уже существующий скрипт подсчитывает объем почтовых ящиков пользователей и отправляет им письма с "угрозами" , если пользователь не реагирует в течение трех дней его скрипт заносит в черный список в котором можно только принимать любую почту , а отправлять только на локальные адреса. Но есть привилегированные пользователи которым закон не писан , соответственно их нужно удалять из файла.

#285084
"l_cho" написал:
Идея такова уже существующий скрипт подсчитывает объем почтовых ящиков пользователей

а квоту поставить ни как? чем городить велосипед

#285085

в порядке бреда:
1. сортируем оба файла
2. делаем diff , на выходе получаем с '>' то что есть только во втором и с '<' то, что есть только в первом....

#285086

Грабли в том , что Машина под OS debian введена в домен Windows server , соответственно все юзера как локальные , и как им дать разные квоты я не нашел ответа , этот вопрос я уже задавал на форуме. Вот и пришлось велосипед придумывать , что печально.

#285090

Вот так придумал...

text
fgrep -xvf file2 file1 > file3
#285091
"-=Serj=-" написал:
fgrep -xvf

Работает , от всей души огромное спасибо
fgrep такой функции не разу не Гуглил

#289335
-=Serj=- написал:
Вот так придумал...
text
fgrep -xvf file2 file1 > file3

А что за опция -x? -v и -f нашел, понятно. Почему последовательность file2 file1, а не наоборот?Спасибо. Извините за вопрос, самоучусь. :D

#289338
Oleg65 написал:

А что за опция -x?
text
-x, --line-regexp
              Select only those matches that exactly match the whole line.  (-x is specified by POSIX.)

Вывести только то, что соответствует целой линии.

#289340

Спасибо! fgrep нагуглил, а там такой опции нет. Оказывается спецификация Посикс... Сапсибо! А файлы почему в таком порядке - снала файл2 затем файл1?

#289342
"Oleg65" написал:
Спасибо! fgrep нагуглил, а там такой опции нет.

Вызов напрямую fgrep, как сказано в man fgrep, устарел, оставлен для совместимости с древними программами, его использующими.
Современное использование — grep -F

"Oleg65" написал:
А файлы почему в таком порядке - снала файл2 затем файл1?

Конструкция -f file2 file1 — обозначает брать образцы (шаблоны) из файла file2 и искать в следующем за ней file1.
То есть -f file2 — это «что искать», а file2 — «где искать».

#289345
l_cho написал:
изначально существует получить
file1 file2 file3
1 2 3
2 1
3
Идея такова уже существующий скрипт подсчитывает объем почтовых ящиков пользователей и отправляет им письма с "угрозами" , если пользователь не реагирует в течение трех дней его скрипт заносит в черный список в котором можно только принимать любую почту , а отправлять только на локальные адреса. Но есть привилегированные пользователи которым закон не писан , соответственно их нужно удалять из файла.

Т.е. в данном случае ищем (сопоставляем) в файле 1 то что есть в файле2 (на повторение). Если бы сопоставляемые файлы были бы в файл1, а больше различных, в т.ч. сопоставляемых, файлов в файл2, то соотвественно выглядело бы -f file1 file2?

#289411

Команда fgrep аналогична команде grep, но вместо регулярных выражений она на входе принимает список фиксированных строк,
разделенных символами новой строки. Она эквивалентна команде grep -F. fgrep, как правило, используется с опцией -f, которая считывает шаблоны из файла.
Например, если у вас есть словарный файл с большим количеством строк:

text
$ cat my_dictionary_file
aardvark
aback
abandon
...

то вы можете без труда проделать поиск этих строк в наборе
входных файлов:

text
$ fgrep -f my_dictionary_file *
#289505

Насколько я понял: * - это искомая строка ( скажем aback) в файле my_dictionary_file?

#289508
"Oleg65" написал:
Насколько я понял: * - это искомая строка ( скажем aback) в файле my_dictionary_file?

Нет, «*» — любой файл в текущем каталоге.

#289526
Lupo Alberto написал:
[quote="Oleg65"]Насколько я понял: * - это искомая строка ( скажем aback) в файле my_dictionary_file?

Нет, «*» — любой файл в текущем каталоге.[/quote]
На самом деле несколько сложнее, но, как минимум, все не скрытые (имя начинается не с точки). Именно список всех таких имен файлов, поскольку именно его, а не звездочку, получит grep в командой строке. Раскрытие шаблона в список (глобинг) выполнит шелл перед вызовом grep. Подробнее в руководстве по bash или иному *sh.

#289535
-=Serj=- написал:
Команда fgrep аналогична команде grep, но вместо регулярных выражений она на входе принимает список фиксированных строк,
разделенных символами новой строки
. Она эквивалентна команде grep -F. fgrep, как правило, используется с опцией -f, которая считывает шаблоны из файла.
Например, если у вас есть словарный файл с большим количеством строк:
text
$ cat my_dictionary_file
aardvark
aback
abandon
...

то вы можете без труда проделать поиск этих строк в наборе
входных файлов:

text
$ fgrep -f my_dictionary_file *

Спасибо, виноват, внимательность и бдительность потерял. Список фиксированных строк разделенных символами новой строки! :D
Наверное это старость, зрелостью не назовешь! :D

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