Добавление и вычитание нескольких столбцов в новый столбец

Вы действительно не хотите запускать эти команды в качестве службы запуска, а скорее как часть вашего X-сеанса при его запуске.

Если они запускаются в сценарии инициализации, они запускаются от имени пользователя root в контексте запуска, а не как часть вашего X-сеанса.

Лучше поместить эти команды в xinitrc или xsessionrc (в зависимости от того, как вы запускаете X ).

2
03.05.2021, 18:53
2 ответа

Если было бы полезно обращаться к полям по их именам (, например. если порядок столбцов может меняться):

$ cat tst.awk
BEGIN { FS=OFS="," }
NR == 1 {
    $(NF+1) = "emotional_polarity"
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
NR > 1 {
    $(f["emotional_polarity"]) = \
        ( $(f["likes_count"]) + $(f["love_count"]) + $(f["thankful_count"]) ) \
            - ( $(f["angry_count"]) + $(f["sad_count"]) )

}
{ print }

$ awk -f tst.awk file
publish_date,headline_text,likes_count,comments_count,shares_count,love_count,wow_count,haha_count,sad_count,thankful_count,angry_count,emotional_polarity
20030219,aba decides against community broadcasting licence,1106,118,109,155,6,5,2,0,6,1253
20030219,act fire witnesses must be aware of defamation,137,362,67,0,0,0,0,0,0,137
20030219,a g calls for infrastructure protection summit,357,119,212,0,0,0,0,0,0,357
20030219,air nz staff in aust strike for pay rise,826,254,105,105,21,45,7,0,90,834
20030219,air nz strike to affect australian travellers,693,123,153,17,113,4,103,0,7,600
20030219,ambitious olsson wins triple jump,488,57,161,0,0,0,0,0,0,488
20030219,antic delighted with record breaking barca,386,60,80,3,4,0,93,0,68,228
20030219,aussie qualifier stosur wastes four memphis match,751,45,297,0,0,0,0,0,0,751
20030219,aust addresses un security council over iraq,3847,622,141,1,0,0,0,0,0,3848
20030219,australia is locked into war timetable opp,1330,205,874,0,0,0,0,0,0,1330
20030219,australia to contribute 10 million in aid to iraq,3530,130,0,23,16,4,1,0,0,3552
20030219,barca take record as robson celebrates birthday in,13875,331,484,0,0,0,0,0,0,13875
20030219,bathhouse plans move ahead,11202,450,2576,433,51,20,4,0,34,11597
20030219,big hopes for launceston cycling championship,3988,445,955,0,0,0,0,0,0,3988
20030219,big plan to boost paroo water supplies,460,101,92,0,0,0,0,0,0,460
20030219,blizzard buries united states in bills,303,223,193,0,0,0,0,0,0,303
3
28.07.2021, 11:35

Я бы внес два изменения в то, что вы пробовали. Это ваша команда:

awk -F, '{$12=$3+$6+$10-$11-$9;}{print }' file

Когда OFS=","используется в блоке BEGIN, половина нашей работы выполнена. Вот как поля разделяются при печати. Затем if(NR==1) $NF="emotional_polarity"делает вторую половину. Хотя использование $(NF+1)лучше, чем $12, я бы использовал здесь $12. $12=$a+..$bдобавить еще одно поле в $0. Это увеличивает значение NF на единицу. Поэтому выражение ifизменяет последнее поле строки 1(NR ==1)на «эмоциональную _полярность». Теперь я помещаю эти два выражения в вашу команду.

awk -F, 'BEGIN{OFS=","}{$12=$3+$6+$10-$11-$9; if(NR==1) $NF="emotional_polarity"}{print }' file

Я попробовал это с таким массивом:

awk -F',' 'BEGIN{OFS=","}
{arr[NR][1]=$0; arr[NR][2]=$3+$6+$10-$11-$9;}
END {
arr[1][2]="emotional_polarity";
for(i=1;i<=NR;i++) print arr[i][1], arr[i][2] }' file

arr[NR][1]принимает весь вывод $0, тогда как arr[NR][2]выполняет вычисления.

В блоке ENDмы установили arr[1][2]на «эмоциональную _полярность», потому что мы хотели назвать поле эмоциональной _полярностью. Затем мы говорим awkнапечатать.

1
28.07.2021, 11:35

Теги

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