получить кусок списка в bash - PullRequest
0 голосов
/ 22 сентября 2018

Мне нужно разделить на 3, список похож на это с более чем 3000 строк.Мне нужно сделать деление таким образом, чтобы я мог указать что-то вроде:

  1. chunk -> от слов, начинающихся с «а», до слов, начинающихся с «е» (включая все слова, начинающиеся сбуква «е»).
  2. chunk -> от слов, начинающихся с «f», до слов, начинающихся с «mj» (включая все слова, начинающиеся с «mj»).
  3. chunk -> от слов, начинающихся с «mk», до слов, начинающихся с «z».

Пример ввода:

about
block
echo
far
maps
mjalgo
mjprou
mksomething
november
opshacom
oscar
softball
zorro

Есть идеи, как этого добиться?Мне не нужна одна команда, чтобы сделать все это, мне просто нужно знать, как написать 1 команду для каждого необходимого чанка.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

С регулярным выражением типа диапазона, например /^c/ -- /^dd/, вы можете использовать sed для отсортированного файла:

$ sed -nE '/^c/,/^dd/p' file.txt
caccount@example.com
daccount@example.com
ddaccount@domain.com

Или perl:

$ perl -ne 'print if /^c/ .. /^dd/' file.txt
caccount@example.com
daccount@example.com
ddaccount@domain.com

Или awk:

$ awk '/^c/,/^dd/' file.txt
caccount@example.com
daccount@example.com
ddaccount@domain.com

Исходя из нового сообщения:

Если вы хотите группировать по различным матчам регулярного выражения, awk - ваша лучшая ставка (или несколько прогонов sed grep и т. Д.)

Пример:

$ cat file.txt
about
block
echo
far
maps
mjalgo
mjprou
mksomething
november
opshacom
oscar
softball
zorro

Вы можете сделать:

$ awk '/^[a-e]/               {print $0>"f1.txt"; next}
     /^[f-k]/ || /^m[a-j]/    {print $0>"f2.txt"; next}
     /^m[k-z]/ || /^[n-z]/    {print $0>"f3.txt"; next}
     ' file.txt

Затем у вас есть 3 ведра в 3 разных файлах:

for fn in f{1..3}.txt; do
    sort "$fn"
    echo "==="
done   

Отпечатки:

about
block
blood
echo
===
maps
mjalgo
mjprou
===
mksomething
november
opshacom
oscar
softball
zorro
===

Если вход отсортирован, сортировка каждого файла не требуется.Если у вас gawk против POSIX awk, вы можете отсортировать строки внутри.

0 голосов
/ 22 сентября 2018

Вы можете попробовать с помощью csplit

csplit infile /^f/ /^mk/
0 голосов
/ 22 сентября 2018
$ awk '$0>="c" && $0<"dd"' file
caccount@example.com
daccount@example.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...