GNU Parallel включает env_parallel
. В части env_parallel
перечислены все переменные для поддерживаемых оболочек.
Для bash
это код :
_names_of_VARIABLES() {
compgen -A variable
}
_bodies_of_VARIABLES() {
typeset -p "$@"
}
Таким образом, учитывая все переменные, нам нужно выяснить, какие из них установлены пользователем. Мы можем сделать это, жестко запрограммировав все переменные, установленные данной версией bash
, но это не будет очень надежным доказательством будущего, потому что bash
может установить больше переменных в будущих версиях (Является ли $BASH_MYVAR
установлен пользователем или будущей версией bash
? ).
Вместо этого env_parallel
просит вас определить чистую среду и запустить env_parallel --session
в ней. Это установит $PARALLEL_IGNORED_NAMES
путем перечисления имен, определенных до (с использованием кода выше ).
При последующем запуске в среде, в которой пользователь задал переменные, легко определить разницу между чистой средой и текущей средой.
env_parallel --session
позволяет определить чистую среду для каждого сеанса, но если вы предпочитаете иметь эталонную среду, которую можно использовать между сеансами, просто сохраните список переменных в файле.Так:
# In clean envronment
compgen -A variable > ~/.clean-env-vars
# In environment with user defined vars
compgen -A variable | grep -Fxvf ~/.clean-env-vars
Например:
#!/bin/bash
# In clean envronment
compgen -A variable > ~/.clean-env-vars
myvar=4
yourvar=3
# In environment with user defined vars
compgen -A variable | grep -Fxvf ~/.clean-env-vars
# This prints:
# myvar
# yourvar
# PIPESTATUS (which is set when running a pipe)
#!/bin/awk -f
BEGIN {
dow[1] = "Monday"
dow[2] = "Tuesday"
dow[3] = "Wednesday"
dow[4] = "Thursday"
dow[5] = "Friday"
dow[6] = "Saturday"
dow[7] = "Sunday"
FS=OFS=","
}
NR == 1 {print $1, $2, $10, $13, $14, $15, $19, $20, $21}
NR != 1 {
$2 = dow[$2]
$21 *= 1.852
gsub(/"/, "", $10)
gsub(/"/, "", $13)
gsub(/"/, "", $14)
print $1, $2, $10, $13, $14, $15, $19, $20, $21
}
Сохраните это в файл, например:sample.awk
. Сделайте его исполняемым:chmod +x sample.awk
и запустите как ./sample.awk data
.
Чтобы сохранить вывод в другом файле, добавьте оператор перенаправления вывода следующим образом:./sample.awk data > out.csv
awk '
BEGIN {
split("Monday Tuesday Wednesday Thursday Friday Saturday Sunday",days)
FS=OFS=","
}
NR > 1 {
gsub(/"/,"")
$2 = days[$2]
$21 *= 1.852
}
{ print $1, $2, $10, $13, $14, $15, $19, $20, $21 }
' file
"DAY_OF_MONTH","DAY_OF_WEEK","ORIGIN","DEST","DEP_TIME","DEP_DEL15","CANCELLED","DIVERTED","DISTANCE"
1,Tuesday,ORD,GRB,1003,0.00,0.00,0.00,322.248
1,Tuesday,TUL,ORD,1027,0.00,0.00,0.00,1083.42
1,Tuesday,EWR,TYS,1848,0.00,0.00,0.00,1168.61