2014-12-02 2 views
0

Я новичок в сценариях оболочки. Мне интересно, как узнать, как сортировать содержимое файла с помощью сценариев оболочки.Как отсортировать содержимое текстового файла с помощью сценария оболочки

Вот пример:

fap0089-josh.baker 
fap00233-adrian.edwards 
fap00293-bob.boyle 
fap00293-bob.jones 
fap002-brian.lopez 
fap00293-colby.morris 
fap00293-cole.mitchell 
psf0354-SKOWALSKI 
psf0354-SLEE 
psf0382-SLOWE 
psf0391-SNOMURA 
psf0354-SPATEL 
psf0364-SRICHARDS 
psf0354-SSEIBERT 
psf0354-SSIRAH 
bsi0004-STRAN 
bsi0894-STURBIC 
unit054-SUNDERWOOD 

Учитывая данные выше (это небольшой набор, у меня есть более 5,5 записей), я хотел бы уладить это так:

  1. Количество записей, начинающихся с fap, psf, bsi, unit и т. Д.
  2. Общее количество сред для каждого типа, то есть: каждое числовое число после слова 0004,0382,054 и т. Д. - это среды. например: psf имеет 4 уникальные среды.
  3. Сумма
+1

«Количество записей, начиная с FAP, PSF, BSI, блок и т.д.» означает количество строк каждого типа префикса? «общее количество сред для каждого типа» номера из первой части, также разбитые подтипом? «Сумма» чего? Вы имеете в виду «сортировку» или вы имеете в виду «анализ»/«подсчет»? Вы что-то пробовали? –

+1

Учитывая этот ввод, какой результат вы ожидаете увидеть? –

+0

Вы хотите * сортировать * файл или хотите просто получить то, что хотите. Вы считаете решение 'awk' вашей проблемы? 'awk' на самом деле является его собственным языком программирования, но это такая старая часть Unix, что многие люди считают использование awk в качестве решения _shell. –

ответ

2

Вот преобразование Шварца для сортировки 1) ведущие буквы, затем 2) цифры

sed -r 's/^([[:alpha:]]+)([[:digit:]]+)/\1 \2 /' filename | 
sort -t ' ' -k 1,1 -k 2,2n | 
sed 's/ //; s/ //' 

выход:

bsi0004-STRAN 
bsi0894-STURBIC 
fap002-brian.lopez 
fap0089-josh.baker 
fap00233-adrian.edwards 
fap00293-bob.boyle 
fap00293-bob.jones 
fap00293-colby.morris 
fap00293-cole.mitchell 
psf0354-SKOWALSKI 
psf0354-SLEE 
psf0354-SPATEL 
psf0354-SSEIBERT 
psf0354-SSIRAH 
psf0364-SRICHARDS 
psf0382-SLOWE 
psf0391-SNOMURA 
unit054-SUNDERWOOD 

Для создания метрик вы упоминаете , Я бы использовал perl:

perl -nE ' 
    /^([[:alpha:]]+)(\d+)/ or next; 
    $count{$1}++; 
    $nenv{$1}{$2}=1; 
    $total+=$2 
} 
END { 
    say "Counts:"; 
    say "$_ => $count{$_}" for sort keys %count; 
    say "Number of environments"; 
    say "$_ => ", scalar keys %{$nenv{$_}} for sort keys %nenv; 
    say "Total = $total"; 
' filename 
Counts: 
bsi => 2 
fap => 7 
psf => 8 
unit => 1 
Number of environments 
bsi => 2 
fap => 4 
psf => 4 
unit => 1 
Total = 5355 

Без использования perl он менее эффективен, потому что вы должны прочитать файл несколько раз.

echo Counts: 
sed 's/[0-9].*//' filename | sort | uniq -c 
echo Number of environments: 
sed -r 's/^([a-z]+)([0-9]*).*/\1 \2/' filename | sort -u | cut -d" " -f1 | uniq -c 
echo Total: 
{ printf "%d+" $(sed -r 's/^[a-z0]+([0-9]*).*/\1/' filename); echo 0; } | bc 
Counts: 
     2 bsi 
     7 fap 
     8 psf 
     1 unit 
Number of environments: 
     2 bsi 
     4 fap 
     4 psf 
     1 unit 
Total: 
5355 
+0

I плохо в perl. Используется ли этот скрипт perl, когда он помещается в файл оболочки под сценарием оболочки? Может ли это быть реализовано в чистом коде Unix? – Karthik

+0

Нет такой вещи, как «чистый код unix». Сценарии оболочки - это просто команды, выполняемые в некотором порядке, а perl - команда grep или sed. Тем не менее, я добавил бесплатную версию –

+0

Большое спасибо Glenn. Я использую этот скрипт для запуска этого файла. Он вызывает ошибку. Файл: http://www.filedropper.com/all-dss-accounts Этот файл содержит 565075 записей, которые необходимо сортировать. – Karthik

Смежные вопросы