LINUX.ORG.RU

Удаление повторов в grep

 ,


0

3

Пользуюсь grep для извлечения строк из одного содержащие заданные подстроки другого списка

grep -f список1 список2

Хочу отфильтровать результаты чтобы в качестве результатов не было двух разных строк содержащих одинаковые подстроки

причем вот так не катит

grep -f список1 список2| sort -t: -u -k1,1

поскольку удаляет больше чем надо кто-нибудь знает еще варианты

grep m 1 

не предлагать останавливается после первого элемента списка

Напиши простенький пример, показав содержимое файлов список1 и список2, ‘неправильный’ выхлоп команды grep и какой хотел бы ‘правильный’ выхлоп grep.

Имхо, может многим задача понятна из темы, но я мало что понял. )

krasnh ★★★
()

В комментах как обычно дичь.

Тебе нужно использовать скриптовый ЯП для этого, так как решение в ходе работы потребует хранить состояние. awk,, perl, python, ruby, любой подойдёт.

wandrien ★★
()
Ответ на: комментарий от krasnh

Я упрощу вопрос (возможно он станет понятнее)

cd /tmp
git clone https://gitlab.gnome.org/YaLTeR/video-trimmer.git
...
grep -Hr "build" /tmp/videotrimmer/*

videotrimmer взял исключительно для примера

тоже самое задаю в doublecommander https://imgur.com/kmHRvLi

atlase0
() автор топика
Ответ на: комментарий от atlase0

Понятнее не стало, так как теперь вопрос по смыслу отличается от того, что было в ОП.

Но если нужно просто отфильтровать дубликаты, то можно так:

grep -Hr "build" . | awk '! x[$0]++'
wandrien ★★
()
Ответ на: комментарий от krasnh

Ага, никакой разницы.

$ printf '%s\n' 🧙 🧚 🧛 🧜 🧝 |sort |uniq
🧙
🧚
🧛
🧜
🧝

vs

$ printf '%s\n' 🧙 🧚 🧛 🧜 🧝 |sort -u
🧙
Ja-Ja-Hey-Ho ★★★★
()
Последнее исправление: Ja-Ja-Hey-Ho (всего исправлений: 1)
Ответ на: комментарий от wandrien

Хочу добавить к шапке те результаты которые я получил возможно они точнее помогут меня понять вот результаты grep и doublecommander см рис https://imgur.com/a/Ml4Q3Ik

Так вот хотелось бы чтобы результат grep представлялся в адекватном виде как это сделал doublecommander - нет никакой необходимости стотысячпятьсот писать путь к одному и тому же файлу (вот из -за чего собственно был задан вопрос) в grep как я уже говорил есть опция m но она одноразовая т.е один раз выполнилась для одного случая в моем случае нашла первый файл содержащий заданное слово и остановилась выведя результат, если файлов содержащих искомое слово несколько или несколько искомых слов опция f то тут уже возникают проблемы опции m Спасибо за Ваш вариант буду пробовать

atlase0
() автор топика

Вот смотрю, сейчас как раз две темы на форуме, где авторы пытаются путано и сбивчиво объяснить, чего им надо-то.

Вместо того, чтобы просто привести пример задачи: вот исходные данные, а вот что программа должна выдать в терминал.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от iron

Я же выложил картинку написал словами как еще объяснить есть текст «текст» при рекурсивном поиске этого текста в файлах с помощью греп возникают повторы вызванные тем что в искомых файлах данный паттерн («текст») встрачается не одн раз в результате получаем что-то типа

/путь/к/файлу1: текст
/путь/к/файлу1: текст
....
/путь/к/файлу1: текст

/путь/к/файлу2: текст
....
/путь/к/файлу2: текст
...
/путь/к/файлуN: текст
...
/путь/к/файлуN: текст

atlase0
() автор топика
Ответ на: комментарий от iron

Виноват не знал что imgur некорректно работает не показывает картинку вот кстати ты мне дал хорошую мысль чего не хватает на форуме - хостинга картинок.

atlase0
() автор топика
Ответ на: комментарий от atlase0

Команда которую написал выше выводит лишь один раз название файла, в котором искомый текст может встречаться множество раз. Что не так?

iron ★★★★★
()

Вот обновленные ссылки на картинки (предыдущие не грузятся) https://yapx.ru/album/WqkXD результат слева douclecmd (какой я спрашивал в шапке) справа grep c повторами https://yapx.ru/album/WqkYG настройки doublecmd для получения результата

atlase0
() автор топика
Ответ на: комментарий от iron

Во всех командах что мне дали есть повторы под повторами я понимаю 1 путь к одному и тому же файлу повторяющийся n раз 2. разные пути, но к одноименным файлам

Специально для ответа на твой вопрос я указал: a) тестовый проект (video-trimmer) на чем тестировал команды (grep (простите не указал версию)) в т.ч. и приведенные здесь б) эталонный вариант (п/о doublecommander со всеми параметрами), чтобы сумневающиеся могли проверить и убедиться в правоте моих слов или указать на мою неправоту. Иными словами при тех же исходных параметрах/опциях добиться одинаковости вывода результата (в grep и doublecommander[последний выводит более корректный результат] мне не удалось.

atlase0
() автор топика
Ответ на: комментарий от masa

Если ты сравнишь вывод grep что предлагаешь ты с выводом doublecmd то они также совпадать не будут т.е в этом случае grep выдаст не весь результат на выходе т.е получим усеченный (более куцый )вывод чем с doublecmd

atlase0
() автор топика

Уважаемые участники данного обсуждения поскольку результат так и не был найден (все равно спасибо за Ваши попытки помочь), все Ваши ответы я тщательно проверил, но их результат не идет ни в какое сравнение с doublecmd в связи с этим у меня вопрос есть ли альтернатива grep ( не не fgrep и т.д. а самостоятельная) ?

atlase0
() автор топика
Ответ на: комментарий от wandrien

Хорошо, если автора считают неумеющим воспользоваться приведенными примерами помощи, сегодня же соберу все варианты и затем выложу картинки с результатами и моим комментом - что в каждом результате не устраивает (сравним с результатом dc) пусть все увидят что предлагаемые варианты ему проигрывают.

atlase0
() автор топика
Последнее исправление: atlase0 (всего исправлений: 1)
Ответ на: комментарий от wandrien

Итак вот твой вариант решения

cd /tmp/video-trimmer/ && grep -Hr "build" . | awk '! x[$0]++'

./src/window.rs:                let file_chooser = gtk::FileChooserNative::builder()
./src/window.rs:                    .build();
./src/window.rs:                                    let dialog = gtk::MessageDialog::builder()
./src/window.rs:                                        .build();
./src/window.rs:                    let trimming_dialog = gtk::MessageDialog::builder()
./src/window.rs:                        .build();
./src/window.rs:                        let builder = match subprocess_clone.communicate_future(None).await {
./src/window.rs:                                    gtk::MessageDialog::builder()
./src/window.rs:                                gtk::MessageDialog::builder()
./src/window.rs:                        let dialog = builder
./src/window.rs:                            .build();
./src/window.rs:                    let dialog = gtk::MessageDialog::builder()
./src/window.rs:                let dialog = gtk::MessageDialog::builder()
./src/window.rs:                let about_window = adw::AboutWindow::builder()
./src/window.rs:                    let file_chooser = gtk::FileChooserNative::builder()
./src/window.rs:                                let dialog = gtk::MessageDialog::builder()
./src/window.rs:                                    .build();
./src/window.rs:        glib::Object::builder()
./src/window.rs:            .build()
./src/video_preview.rs:                    Signal::builder("set-start-end")
./src/video_preview.rs:                        .build(),
./src/video_preview.rs:                    Signal::builder("error").build(),
./src/timeline.rs:                [Signal::builder("set-start-end")
./src/timeline.rs:                    .build()]
./src/meson.build:  join_paths(meson.project_build_root(), 'src', 'config.rs'),
./src/meson.build:cargo_script = find_program(join_paths(meson.project_source_root(), 'build-aux/cargo.sh'))
./src/meson.build:  'cargo-build',
./src/meson.build:  build_by_default: true,
./src/meson.build:    meson.project_build_root(),
./src/main.rs:                .expect("unable to load video-trimmer.gresource from build dir")
./src/application.rs:        glib::Object::builder()
./src/application.rs:            .build()
./meson_options.txt:  description: 'The build profile. One of "default" or "development".'
./meson.build:  'build-aux/dist-vendor.sh',
./meson.build:  meson.project_build_root() / 'meson-dist' / meson.project_name() + '-' + meson.project_version(),
./build-aux/org.gnome.gitlab.YaLTeR.VideoTrimmer.Devel.json:    "build-options" : {
./build-aux/org.gnome.gitlab.YaLTeR.VideoTrimmer.Devel.json:        "build-args" : [
./build-aux/org.gnome.gitlab.YaLTeR.VideoTrimmer.Devel.json:            "buildsystem" : "meson",
./build-aux/org.gnome.gitlab.YaLTeR.VideoTrimmer.Devel.json:            "builddir" : true,
./build-aux/cargo.sh:    cargo build --manifest-path \
./README.md:Alternatively, you can build it manually:
./README.md:meson -Dprofile=development -Dprefix=$PWD/install build
./README.md:ninja -C build install
./.gitlab-ci.yml:    MANIFEST_PATH: "build-aux/org.gnome.gitlab.YaLTeR.VideoTrimmer.Devel.json"
./.gitignore:/build/
./.gitignore:/.flatpak-builder/
./.gitignore:/builddir/
./.gitignore:/_build/
https://www.linux.org.ru/forum/general/17390287?cid=17391133
atlase0
() автор топика

А никто не знает, как сделать тоже самое т.е вывести неповторяющиеся файлы как это было сделано тут Удаление повторов в grep (комментарий), но так, чтобы печатать на экране и их содержимое аналогично тому что делает опция -H, так чтобы на экран было выведено именно содержимое разных файлов потому как -H выводит содержимое одного и того же файла, если он содержит повторяющиеся ключевые слова?

atlase0
() автор топика