Добавление и сортировка значений в Bash-скрипте - PullRequest
1 голос
/ 10 мая 2019

Я пытался решить эту проблему, но ничего из того, что я пробовал, на самом деле не работает. У меня есть таблица, в которой (из файла .txt) мне нужно отсортировать по числовому порядку конкретного необработанного таблицы.

Данные, которые я имею, составлены так:

Name  Team Age    
David  a   20   
James  b   25   
Anthony  c   22  
Carter  b   21   
Jessica  a   24   

В основном, что мне нужно для заказа (от наименьшего до наибольшего) возраста определенной команды, пример А. Таким образом, ожидаемый результат будет:

a 20    
a 24  

Ответы [ 4 ]

1 голос
/ 10 мая 2019
awk '$2==team{print $2,$3}' team='a' file | sort -t' ' -k2n
0 голосов
/ 10 мая 2019

Решение awk без отдельной трубы и подоболочки для сортировки может быть:

awk '$2 == "a" {arr[$3]} END {for (i in arr) print "a", i}' file

Вы просто сохраняете age как индексы в массиве, а затем выводите индексы в конце, что обеспечивает внутреннюю сортировку без отдельного процесса, например,

Пример использования / Вывод

$ awk '$2 == "a" {arr[$3]} END {for (i in arr) print "a", i}' file
a 20
a 24

Позвонив по внешнему sort, вы можете уменьшить количество набираемых символов, но затем получить дополнительные служебные данные канала, а также подоболочку, необходимую для sort, например,

awk '$2 == "a" {print $2, $3}' file | sort

(тот же вывод)

0 голосов
/ 10 мая 2019

Один только Bash явно не лучший инструмент для этой работы.

Если вы любите код Bash, как я, вам, вероятно, все равно будет интересно решение только для Bash (ну, почти, давайте не будем изобретать sort ing):

#!/bin/bash

firstline=true
declare -A sumPerTeam     # declare associative array

# collect sum for each team in the associative array:
while read name team age
do
    [ "$firstline" = true ] && { firstline= ; continue ; }    # skip header
    sumPerTeam[${team}]=$(( "${sumPerTeam[${team}]}" + age ))
done < input.txt

# output each key/value pair of the array:
for team in "${!sumPerTeam[@]}"
do
    echo "$team" "${sumPerTeam[${team}]}"
done | sort -k2

Ассоциативные массивы - не самая читаемая особенность Bash.

0 голосов
/ 10 мая 2019

Вы можете очень легко справиться с этим с помощью SQL и функций SUM и GROUP BY:

SELECT team, SUM(age) FROM table1 GROUP BY team;

+------+----------+
| team | SUM(age) |
+------+----------+
| a    |       44 |
| b    |       46 |
| c    |       22 |
+------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...