Если вы хотите напечатать col 2 и 8, просто добавьте $8 к печати.
ps -ef | grep runner | awk {'print $2" "$8'}
Как насчет
$ 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 за предложенные улучшения
Как далеко это заведет вас:
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
Вы можете разделить распечатку на два файла результатов.
С конвейером 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
Подходит ли 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
Где мы запустили точно такой же код, но теперь получили длину каждого сегмента и превратили эту длину в строку для конкатенации.