$ ps -eLf UID PID PPID LWP C NLWP STIME TTY TIME CMD root 1 0 1 0 1 19:25 ? 00:00:00 init [4] ... root 1699 1 1699 0 1 19:25 ? 00:00:00 /usr/bin/kdm root 1701 1699 1701 8 2 19:25 tty10 00:13:10 /usr/bin/X :1 vt10 ... root 1701 1699 1703 0 2 19:25 tty10 00:00:00 /usr/bin/X :1 vt10 ... root 1706 1699 1706 0 1 19:25 ? 00:00:00 -:1 root 1707 1699 1707 0 2 19:25 tty9 00:00:02 /usr/bin/X :0 vt9 ... root 1707 1699 1710 0 2 19:25 tty9 00:00:00 /usr/bin/X :0 vt9 ... root 1713 1699 1713 0 1 19:25 ? 00:00:00 -:0 ....
отвечает на Ваш вопрос, я думаю.
Тем не менее, вопрос, кажется, смешивает несколько вещей - многопоточность не о не использовании
fork()
/exec()
. Потоки совместно используют то же адресное пространство и если Вы хотите выполнить другой процесс, Вы, конечно, не хотите, чтобы оно имело доступ к тому же адресному пространству. И если Вы решили не использовать внешние программы (особенно в оболочке, что, так как Вы упоминаете это), необходимо было бы кодировать всю функциональность снова.Многопоточность не является средством исправления для всего. Это может главным образом быть средство исправления только для хорошо parallelizable проблем на самом деле - проверяют страницу Wiki на хороший краткий обзор. Создание многопоточной программы не делает его лучше, в большинстве случаев это делает это хуже из-за ошибок в коде синхронизации (если существующий вообще).
Немного более читабельный в файле:
Если вы хотите, чтобы выход был отсортирован, то передайте выход в [113811] сортировку [113812]:
Для вашего входа образца это даст:
cut -b-2[115489] выбирает два первых символа, [115490] сортирует -nr[115491] сортирует результаты по самой высокой частоте сначала
Результирующий вывод:
Или как питоновый oneliner, просто для черта:
Результирующий вывод:
Флаг [115492]-o[115493] указывает [115494]grep[115495] на вывод только соответствующей части строки, а [115496]-P[115497] активирует Perl Compatible Regular Expressions, что позволяет использовать [115498]\d[115499] для чисел. Таким образом, [115500]grep[115501] выведет самый длинный отрезок, найденный в начале строки (т.е. все до первой нецифровой цифры, [115502].[115503]), а затем [115504]сортирует [115505], и [115506]uniq -c[115507] подсчитывает количество случайностей каждой строки на входе.
[115508]$&[115509] - это строка, соответствующая предыдущей операции сравнения, поэтому мы сохраняем ее в хэш ([115510]%k[115511]) и увеличиваем ее значение на единицу. Блок [115512]END[115513] выведет каждое найденное число ([115514]$_[115515]) и значение, которое он имеет в хэше ([115516]$k{$_}[115517]), количество раз, когда он был найден.А баш (>=версия 4) ассоциативных массивов приближается:
Interval Since Last Panic Report: 472 sec
Panics Since Last Report: 2
Anonymous UUID: D89B5624-FF95-48B5-8F55-0987EA2D2466
Sun Jun 26 18:02:46 2011
panic(cpu 0 caller 0x6e085e4a): "ntfs_map_runlist_nolock(): Called for $MFT/$DATA!\n"@/SourceCache/ntfs/ntfs-65.5/kext/ntfs_attr.c:245
Backtrace (CPU 0), Frame : Return Address (4 potential args on stack)
...
Kernel Extensions in backtrace (with dependencies):
com.apple.filesystems.ntfs(3.4)@0x6e05a000->0x6e0b9fff
BSD process name corresponding to current thread: mount_ntfs
IFS[115519] установлено на [115520].[115521] означает, что входные строки разбиваются на записи по [115522].[115523] так что [115524]$a[115525] будут первыми цифрами вплоть до [115526].[115527]. Проходим через них и используем в качестве ключей к ассоциативному массиву, значение которого увеличивается каждый раз при поиске числа. Затем, после заполнения массива, пропустим по его списку ключей ([115528]${!ll[@]}[115529]) и выведем каждый ключ и его значение (количество раз, когда он был замечен).[115028].
Используя GNU datamash
's bin
option:
datamash -s bin:1 1 < num | datamash -s -g 1 count 1
Output:
24 3
25 4
26 1
29 1
30 3