Заказывая строку под счет подстроки?

Если вы хотите напечатать col 2 и 8, просто добавьте $8 к печати.

ps -ef | grep runner | awk {'print $2" "$8'}
6
03.10.2018, 16:34
4 ответа

Как насчет

$ perl -F'-' -lpe '$_ = join "-", sort { length $a <=> length $b } @F' file
22-212-1234-11153782-0114232192380
14-234-6756-09867378-8807698823332
14-221-45323-43676256-238372635363
23-234-9983-62736373-8863345637388

и

$ perl -F'-' -lpe '$_ = join "-", sort { $a <=> $b } map length, @F' file
2-3-4-8-13
2-3-4-8-13
2-3-5-8-12
2-3-4-8-13

Спасибо Stéphane Chazelas за предложенные улучшения

7
27.01.2020, 20:23

Как далеко это заведет вас:

awk -F- '               # set "-" as the field separator
{
 for (i=1; i<=NF; i++){
   L    = length($i)    # for every single field, calc its length
   T[L] = $i            # and populate the T array with length as index
   if (L>MX){ MX = L }  # keep max length
 }                        
 $0 = ""                # empty line
 for (i=1; i<=MX; i++){
  if (T[i]){
   $0 = $0 OFS T[i]     # append each non-zero T element to the line, separated by "-"
   C  = C OFS i         # keep the field lengths in separate variable C
  }
 }
 print substr ($0, 2) "\t"  substr (C, 2)    # print the line and the field lengths, eliminating each first char
 C = MX = ""                                 # reset working variables
 split ("", T)                               # delete T array
}
' OFS=- file
22-212-1234-11153782-0114232192380  2-3-4-8-13
14-234-6756-09867378-8807698823332  2-3-4-8-13
14-221-45323-43676256-238372635363  2-3-5-8-12
23-234-9983-62736373-8863345637388  2-3-4-8-13

Вы можете разделить распечатку на два файла результатов.

2
27.01.2020, 20:23

С конвейером bash вы можете написать

while IFS=- read -ra words; do 
    for word in "${words[@]}"; do printf "%d\t%s\n" "${#word}" "$word"; done | 
    sort -k1,1n | 
    cut -f2 | 
    paste -sd-
done < file
-1
27.01.2020, 20:23

Подходит ли Python? Если это так, поместите свои строки в numbers.txtи запустите:

with open('numbers.txt') as f:
    for string in f.read().splitlines():
        print('-'.join(sorted(string.split('-'), key=len)))

22-212-1234-11153782-0114232192380
14-234-6756-09867378-8807698823332
14-221-45323-43676256-238372635363
23-234-9983-62736373-8863345637388

Волшебство здесь заключается в том, что параметр keyфункции sortedпринимает функцию длины. Для варианта использования подсчета выполните

with open('numbers.txt') as f:
    for string in f.read().splitlines():
        print('-'.join([str(len(segment))
        for segment in sorted(string.split('-'), key=len)]))

2-3-4-8-13
2-3-4-8-13
2-3-5-8-12
2-3-4-8-13

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

0
27.01.2020, 20:23

Теги

Похожие вопросы