Как получить список каталогов DIRSTACK из сценария?

В ваших данных нет чисел выше 1. Я расширил исходный файл, включив в него некоторые значения с большим количеством цифр перед точкой:

$ cat infile
0.992957746478873 0.00704225352112677
0.646410833917366 0.353589166082634
0.992957746478873 0.00704225352112677
0.5 0.5
16.258137489137 333444.277775666
16.233399999999 333777.277111111

печать

Одним из возможных решений является использование C-совместимой функции printf (В awk есть одна):

формат f (3 (округленные )десятичные разряды)

Точное число 3 (округленных )десятичных знаков:

$ awk '{ printf("%11.3f %11.3f\n", $1,$2) }' infile
      0.993       0.007
      0.646       0.354
      0.993       0.007
      0.500       0.500
     16.258  333444.278
     16.233  333777.277

Обратите внимание, что 0.992957746478873округляется до 0.993.

формат g (значащее (округленное))

Точное количество 3 (значащих )цифр:

$ awk '{ printf("%9.3g %9.3g\n", $1,$2) }' infile
    0.993   0.00704
    0.646     0.354
    0.993   0.00704
      0.5       0.5
     16.3  3.33e+05
     16.2  3.34e+05

Обратите внимание на округление четвертой цифры (, например 3.34e+05)

Строка (не закругленная)

Ровно 3 (не округленные )цифры после запятой.

Использование GNU awk:

$ gawk '{for(i=1;i<=NF;i++){
         printf( "%12s ",gensub(/([0-9]+\.[0-9]{0,3}).*/, "\\1", "g", $i))};print""}
       ' infile
       0.992        0.007
       0.646        0.353
       0.992        0.007
         0.5          0.5
      16.258   333444.277
      16.233   333777.277

Использование sed (возможно быстрее):

$ sed -E 's/([0-9]+\.[0-9]{1,3})[^ ]*/\1/g' infile
0.992 0.007
0.646 0.353
0.992 0.007
0.5 0.5
16.258 333444.277
16.233 333777.277
1
07.04.2020, 05:02
2 ответа

DIRSTACKявляется локальной переменной и не передается в скрипты, подоболочки, дочерние процессы и т.д. Я рекомендую вместо скрипта использовать функцию, загруженную в ваш .bashrc.

2
28.04.2021, 23:18

Я использовал этот прием для извлечения стека каталогов во время каждой сессии. Раньше я сохранял его в файл. Я также могу импортировать / экспортировать в другие терминалы

Определите эту функцию в вашем.bashrc

stackd () 
{ 
    SAVEIFS=$IFS;
    IFS=$(echo -en "\n\b");
    builtin cd $@ && builtin pushd "$PWD" > /dev/null;
    dirs -l -p >> $HOME/.iostackd/dirstack && sort -u -o $HOME/.iostackd/dirstack $HOME/.iostackd/dirstack > /dev/null;
    IFS=$SAVEIFS
}

перегрузите встроенный "cd" псевдонимом

alias cd='stackd "$1"'
1
06.11.2021, 11:34

Теги

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