Сортировка чисел и соответствующих единиц в столбцах

Если бы Вы не можете использовать Augeas и Марионетку, вот то, что я сделал бы:

if grep -qF '^/export/home' /etc/exports;then
    sed -i \
    's@^/export/home.*$@/export/home 2400:123::/32(rw,no_root_squash)@'\
    /etc/exports
else
    echo '/export/home 2400:123::/32(rw,no_root_squash)' >> /etc/exports
fi

Осторожный, хотя: это предполагает что любое правило для экспорта /export/home справедливая игра для того, чтобы быть замененным по Вашему данному определению.

2
29.03.2015, 11:21
3 ответа

Я предпочитаю вариант не изменить существующие данные, но добавляя критерии сортировки в качестве нового столбца, и удаляя это вспомогательное поле сортировки в конце трубы:

awk -F, 'BEGIN {u["kg"]=1000; u["g"]=1}; {print $1*u[$2], $0}' file |
    sort -n | cut -d" " -f2-
4
27.01.2020, 21:50

Если ваш файл слишком большой, чтобы удержаться в памяти, вы можете сделать:

$ awk -F, -v OFS="," '$2=="kg"{$1=1000*$1}1;' file | sort -n | 
    awk -F, -v OFS="," '$2=="kg"{$1=$1/1000}1;'
1000,g,dog
1,kg,cat
20,g,apple
4
27.01.2020, 21:50

Вам может быть лучше преобразовывать блоки в файл, сортировать их и использование полученного хранения файл.

sed -r 's/^([0-9]+),kg/\1000,g/' $file | sort -n

SED не понимает математику, поэтому, если у вас нет инкайдеров, вам придется использовать что-то еще. Ниже приведено быстрый разбор с SED, но использует BC , чтобы сделать фактическую математику, если это необходимо.

sed -r 's/^([0-9]+),kg/\1000,g/;s/^([0-9\.]+),kg/echo $(echo \1*1000 | bc),g/e'
2
27.01.2020, 21:50

Теги

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