Для тех, кому интересно, -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
Во встроенных системах вы часто ограничены тем, что доступно. НАПРИМЕР. 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
export C=$i
непосредственно перед echo
, если это поможет. GNU Parallel часто может быть решением этой проблемы:
parallel -a $INPUTFILE --colsep '|' echo {1}:{2}
Вы можете сохранить вывод файла в переменной, а затем разбить его на две части. пример:
в пример содержимое файла:
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
$ 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