Фильтровать файл с помощью инструментов сценария оболочки - PullRequest
1 голос
/ 02 ноября 2011

У меня есть файл, содержимое которого

E006:Jane:HR:9800:Asst
E005:Bob:HR:5600:Exe
E002:Barney:Purc:2300:PSE
E009:Miffy:Purc:3600:Mngr
E001:Franny:Accts:7670:Mngr
E003:Ostwald:Mrktg:4800:Trainee
E004:Pearl:Accts:1800:SSE
E009:Lala:Mrktg:6566:SE
E018:Popoye:Sales:6400:QAE
E007:Olan:Sales:5800:Asst

Я хочу получить список всех сотрудников, чьи коды emp находятся между E001 и E018, с помощью команды, включая каналы, можно ли получить?

Ответы [ 4 ]

1 голос
/ 02 ноября 2011

Вы можете использовать awk для таких случаев:

$ gawk 'BEGIN { FS=":" } /^E([0-9]+)/ { n=substr($1, 2)+0; if (n >= 6 && n <= 18) { print } }' < data.txt
E006:Jane:HR:9800:Asst
E009:Miffy:Purc:3600:Mngr
E009:Lala:Mrktg:6566:SE
E018:Popoye:Sales:6400:QAE
E007:Olan:Sales:5800:Asst

Это тот результат, который вам нужен? В этом примере намеренно печатаются только сотрудники в возрасте от 6 до 18, чтобы показать, что он фильтруетиз записей.Вы можете напечатать некоторые поля, используя $1 или $2, как в print $1 " " $2.

1 голос
/ 02 ноября 2011

Используйте sed:

sed -n -e '/^E001:/,/^E018:/p' data.txt

То есть выведите строки, которые буквально находятся между теми линиями, которые начинаются с E001 и E018.

Если вы хотите, чтобы сотрудники численно находились между ними, одним из способов сделать это было бы сделать встроенные сравнения, используя что-то вроде awk (как предложено hochl). Или вы можете использовать этот подход, которому предшествует sort (если строки еще не отсортированы).

sort data.txt | sed -n -e '/^E001:/,/^E018:/p'
0 голосов
/ 02 ноября 2011

Просто сравните строки: так как все ваши примеры данных совпадают, я изменил границы для иллюстрации

awk -F: '"E004" <= $1 && $1 <= "E009" {print}'

выход

E006:Jane:HR:9800:Asst
E005:Bob:HR:5600:Exe
E009:Miffy:Purc:3600:Mngr
E004:Pearl:Accts:1800:SSE
E009:Lala:Mrktg:6566:SE
E007:Olan:Sales:5800:Asst

Вы можете передавать строки как переменные, если не хотите жестко их кодировать в скрипте awk

awk -F: -v start=E004 -v stop=E009 'start <= $1 && $1 <= stop {print}'
0 голосов
/ 02 ноября 2011

Вы можете попробовать что-то вроде этого: cut -b2- | awk '{ if ($1 < 18) print "E" $0 }'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...