2013-07-11 3 views
-1

Я хочу напечатать города, которые выполняют 3 условия: capital, clean и big.Найти конкретные имена в unix

Вход:

London is a big city 
London is a capital 
London is a clean city 
Ohio is a big city 
Sydney is a big city 
Sydney is a clean city 
Canberra is a capital 
Canberra is a big city 
Canberra is a clean city 
NewYork is a big city 
NewYork is a clean city 

Выход:

London 
Canberra 

мне нужно только те имена, которые выполняют все 3 условия: капитал, чистый и большой.

Я пытался cut первый столбец в отдельный файл, то для каждого города сделать grep name file|wc -l и принимать только те, которые имеют насчитать более 3. Как это может быть сделано в Unix с помощью sed или awk.

+3

Пожалуйста, покажите нам код, который вы пробовали. – mishik

+0

то, что я пытался это ... Cut первого столбца в отдельном файле затем для каждого города сделать Grep файла имени | туалет -l и берут только те, которые имеют насчитать более 3 – user2571235

+1

Добра пожаловать в Stack Overflow , Вскоре прочитайте страницу [О программе]. Люди помогут вам с проблемами с вашим кодом; люди не просто напишут код для вас. Пожалуйста, отредактируйте, что вы пробовали до сих пор в вопросе. Обратите внимание, что запуск 'cut' в первом столбце отбрасывает информацию о том, какой тип города он есть. –

ответ

1

Просто для удовольствия.

решение SHELL в хакера:

sort -u input.txt | cut -d' ' -f1 | uniq -dc | egrep '^\s+3\s' 

решение Perl-хакера:

#!/usr/bin/perl 
use strict; 
use warnings; 
use constant { 
    CAPITAL => 1, 
    CLEAN => 2, 
    BIG  => 4, 
}; 
my %table; 

while(<>) 
{ 
    print STDERR "Unparsed: $_" unless m/^(\w+)\s+is a\s+((big city)|(clean city)|(capital))\s*$/gio; 

    $table{$1} |= defined($3) * BIG + 
        defined($4) * CLEAN + 
        defined($5) * CAPITAL; 
} 

while (my ($k,$v) = each %table) 
{ 
    print "$k\n" if (CAPITAL+CLEAN+BIG) == $v; 
} 
Смежные вопросы