Это содержание list.csv
:Как использовать переменные оболочки с параллельным GNU?
Apple,Red,10
Banana,Yellow,3
Coconut,White,18
Предположим, у меня есть эта GNU parallel
команду:
parallel -a list.csv -j0 -C, \
color=`echo {2} | sed 's/e/eee/g' | ./capitalize.sh` ";" \
echo "{2}" ";" \
echo "$color" ";"
Чтобы получить:
Red
REEED
Yellow
YEEELLOW
White
WHITEEE
Почему не color
переменная определяется/печататься?
EDIT 20151218: Теперь, когда я получил квотирование право, я хотел бы представить функцию чтения переменной из другой функции, и чтение $0
.
Это рабочий пример без GNU parallel
(я сделал grep
без учета регистра перед отправкой, чтобы облегчить тестирование без ./capitalize.sh
).
while read line; do
doit() {
color=`echo $1 | cut -d, -f2 | sed 's/e/eee/g' | ./capitalize.sh`
}
export -f doit
get_key() {
key=`grep -i $color $0 | cut -d, -f2`
}
export -f get_key
#note that I would use parallel's `-C,` here instead of `cut`.
doit $line #get CSV's 2nd element and make it look like the one in script.
get_key #extract this element's value from the script's comments.
echo "color: $color"
echo "key: $key"
done < list.csv
#Key database in the shell script
# REEED,r-key
# YEEELLOW,y-key
# WHITEEE,w-key
Работа выход:
color: REEED
key: r-key
color: YEEELLOW
key: y-key
color: WHITEEE
key: w-key
Это настолько неправильно, что я не уверен, что начиная с существующего кода разумно. Вы можете подумать о резервном копировании и описании того, что вы на самом деле пытаетесь выполнить. –
(и почему параллель является частью этой цели - в целом, если вы хотите, чтобы результат был в определенном порядке, параллель не является обычно подходящим инструментом для работы, поскольку нет никакой гарантии, что одна задача, которую она порождает, t начать печать в середине вывода другого, чтобы избежать необходимости использования '-k' /' -keep-order' для буферизации и сборки вывода). –
... во всяком случае, если вы используете только параллель, потому что его поддержка ввода CSV, есть далеко, ** далеко ** лучшие способы сделать это в оболочке без нее. (И все остальное - вы можете выполнять строковые манипуляции и капитализацию, используя только встроенные оболочки, гораздо эффективнее, чем запуск внешних инструментов, таких как 'sed'). –