как мы можем использовать несколько переменных в одном цикле for в сценарии оболочки?

Для тех, кому интересно, -e9 на 0,4% меньше, на 20% медленнее при сжатии и на 3% медленнее при распаковке, по сравнению с -9 на обычном ноутбуке. Вот временные прогоны на структуре каталога исходного кода Python.

Compression:

$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861

Decompression:

$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.443

File Size:

$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz
7
28.04.2016, 17:53
4 ответа

Во встроенных системах вы часто ограничены тем, что доступно. НАПРИМЕР. forможет иметь только одну переменную; awkи printfпросто недоступны; или IFSне поддерживается; и т. д.

В этих обстоятельствах вы можете достичь своей цели следующим образом:

export i=xxx
for j in `cat INPUTFILE` ; do \
    [ $i == xxx ] && export i=$j && continue ; \
    echo "$i:$j" ; \
    export i=xxx ; \
done
unset i

Более общая форма этого решения может выглядеть так:

export A=xxx
export B=xxx
for i in 1 2 3 4 5 6 7 8 9 10 11 ; do \
    [ $A == xxx ] && export A=$i && continue ; \
    [ $B == xxx ] && export B=$i && continue ; \
    echo "$A:$B:$i" ; \
    export A=xxx ; \
    export B=xxx ; \
done
unset A
unset B
  • Предполагается, что строка "xxx" никогда не появляется в вашем наборе данных -... Если встречается/может быть, выберите что-нибудь другое.
  • Вы можете иметь любое количество "полей" на "запись"... Просто продублируйте каждую из ЧЕТЫРЕХ строк, которые обрабатывают поля {A, B,...}.
  • Последнее поле всегда называется $i... Не стесняйтесь добавлять export C=$iнепосредственно перед echo, если это поможет.
  • Если количество строк в наборе данных -не кратно размеру записи -, «остаток» (, т.е. |установить| % |запись| )будет потерян.
2
27.01.2020, 20:13

GNU Parallel часто может быть решением этой проблемы:

parallel -a $INPUTFILE --colsep '|' echo {1}:{2}
0
27.01.2020, 20:13

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

в пример содержимое файла:

a:1
b:2
c:3
d:4

Теперь скрипт.

#!/bin/bash
for n in $(cat example)
do
    first=$(echo $n | cut -d ":" -f 1)
    second=$(echo $n | cut -d ":" -f 2)
    echo $first
    echo $second
done
4
27.01.2020, 20:13
$ cat inputfile.txt
foo|bar
baz|foobar
$ cat inputfile.txt | while IFS='|' read i j ; do echo $i:$j ; done
foo:bar
baz:foobar

этот ответ очень похож на этот ответ , но он также отвечает на комментарий о том, что не нужно использовать файловые дескрипторы(<&3)от @sdkks

5
28.04.2020, 15:43

Теги

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