awk-скрипт для подготовки CSV-файла

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)
6
25.05.2021, 00:33
2 ответа
#!/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

10
28.07.2021, 11:29
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
14
28.07.2021, 11:29

Теги

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