2016-10-24 7 views
0

У меня есть небольшая проблема в bash.Пересечение N файлов

У меня есть N файлы, содержащие имена файлов, и я хотел бы найти список имен файлов, которые содержатся во всем файле (пересечение файлов).

Когда есть 2 файла, я нашел это решение: sort file1 file2 | uniq -d, и это на самом деле делает то, что я хочу.

Но как его обобщить до N файлов в той же папке?


File1 

    1 
    2 
    3 
    4 

File2 

    1 
    4 

File3 

    2 
    3 
    4 

Output expected: 

    4 

Заранее спасибо, С наилучшими пожеланиями.

+0

использовать подстановочный знак? 'sort file * | ...'? –

+0

Не работает. Это больше похоже на «отличный союз», а не на перекресток ...:/ –

+5

'uniq -d -c', а затем grep для количества файлов, которые вы включили? поскольку вы пишите файлы, uniq не может знать, откуда пришли данные, или сколько файлов было использовано для создания этого ввода. он может рассчитывать только на обман. –

ответ

2

I`m не Marc B, но все-таки здесь `s осуществление его идеи:

intersect() { 
    sort "[email protected]" | uniq -cd | grep "^[^0-9]*$# " 
} 

# usage example 
intersect file1 file2 file3 

[EDIT:] Для того, чтобы преодолеть проблему дублирующих линий в том же файле, I`d сделать что-то вроде этого:

intersect() { 
    for file in "[email protected]"; do 
     sort -u "$file" 
    done | sort | uniq -cd | grep "^[^0-9]*$# " 
}