Я пытаюсь написать простой скрипт, который будет перечислять содержимое, найденное в двух списках. Чтобы упростить, давайте использовать ls в качестве примера. Представьте, что «один» и «два» являются каталогами.
один = `лс один` two = `ls two` пересечение $ один $ два
Я все еще довольно зеленый в Bash, так что не стесняйтесь исправить, как я это делаю. Мне просто нужна команда, которая распечатает все файлы в «один» и «два». Они должны существовать в обоих. Вы можете назвать это «пересечением» между «один» и «два».
Ответы:
источник
comm
до сегодняшнего дня. Это просто сделало всю мою неделю :)comm
требует, чтобы входы были отсортированы. В этом случаеls
автоматически сортируется вывод, но для этого может потребоваться другое использование:comm -12 <(some-command | sort) <(some-other-command | sort)
public
метода,error()
обеспеченного чертой, в сочетании сgit grep
, и это было потрясающе! Я побежал$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
, и, к счастью, я получил только имя файла, который содержал черту.Решение с
comm
comm
это здорово, но действительно нужно работать с отсортированным списком. И, к счастью, здесь мы используемls
который изls
страницы руководства BashАльтернатива с
sort
Пересечение двух списков:
симметричная разница двух списков:
бонус
Играть с этим ;)
источник
Используйте
comm
команду:«sort» на самом деле не нужен, но я всегда включаю его перед использованием «comm» на всякий случай.
источник
Менее эффективная (чем коммуникативная) альтернатива:
источник
(ls 1; ls 2) | sort -u | uniq -d
.sort -u | uniq -d
ничего не делает, потому что сортировка удалила дубликаты до того, как uniq начнет их искать. Я думаю, вы не поняли, что делает моя команда.cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
что-либо выводить. Моя команда должна читать(ls 1; ls 2) | sort | uniq -d
, без-u
, чтобы показать пересечение списка. @ MikaëlMayer был прав, что моя первоначальная команда была нарушена.ls
чем-то другим, напримерfind
. Ваше решение не допускает этого, потому что если одна из команд возвращает две одинаковые строки, она выбирает ее как дубликат. Мой работает, даже если пользователь хочет сделатьls 1/*
и сравнить все файлы в разных подкаталогах. В противном случае, да, это работает так же. Возможно, мое зависит от bash.Присоединение является еще одним хорошим вариантом в зависимости от ввода и желаемого выхода
источник
Есть еще один вопрос Stackoverflow «Пересечение массива в bash», который помечен как дубликат этого. На мой взгляд, это не совсем то же самое, поскольку этот вопрос говорит о сравнении двух массивов bash, в то время как этот вопрос касается файлов bash. Однострочный ответ на другой вопрос, который сейчас закрыт, выглядит следующим образом:
Утилита comm выполняет буквенно-цифровую сортировку, тогда как «пересечение массивов в bash» использует числа; отсюда использование "sort" и "sort -g".
источник