새 열에 여러 열 더하기 및 빼기

새 열에 여러 열 더하기 및 빼기

csv 파일의 일부를 복사했습니다.

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

새 열을 생성하고 각 항목의 합계(likes_count+love_count+thankful_count) - (angry_count+sad_count)를 합산하고 열 이름을 emotion_ polarity로 지정하는 데 도움이 될 수 있는 셸 명령을 찾고 싶습니다.

나는 열심히 노력했다

awk -F , {$12=$3+$6+$10-$11-$9;}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12} file

하지만 어떤 이유로 작동하지 않습니다. 열이 서로 섞여 있습니다. 이 작업을 하다가 쉼표를 잃어버렸기 때문이 아닐까 싶습니다

답변1

컬렉션 OFS(산소산출에프생산하다에스쪼개는 도구) 또한 쉼표를 잃지 않도록 합니다. 그렇게 하면 $12=$3+$6+$10-$11-$9(예: 모든 열의 값을 설정/업데이트하면(이 경우) 쉼표가 사라집니다.현재 행은 OFS 내부 변수(기본값은 공백 문자)를 기반으로 필드 분할되어 있으므로 이를 쉼표로 설정하면 인쇄할 때 이를 유지합니다.

awk 'BEGIN{ FS=OFS="," }
          { $(NF+1)=(NR==1? "emotional_polarity" : $3+$6+$10-$11-$9); print }' infile

또는 현재 입력 행에 새 업데이트를 추가하면 됩니다.

awk -F, '{ $0=$0 FS (NR==1? "emotional_polarity" : $3+$6+$10-$11-$9); print }' infile

~에서이상한 매뉴얼:

FS
입력 필드 구분 기호(섹션 참조)필드 구분 방법 지정). 값은 입력 레코드의 필드 간 구분과 일치하는 단일 문자 문자열 또는 다중 문자 정규식입니다.

오르페우스
출력 필드 구분 기호(섹션 참조)출력 구분자). print 문에 의해 인쇄된 필드 사이에 출력합니다. 기본값은 " "이며 단일 공백으로 구성된 문자열입니다.

답변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

나는 당신이 시도한 것에 두 가지 변화를 줄 것입니다. 이것은 당신의 명령입니다:

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

OFS=","블록 내에서 사용 하면 BEGIN작업의 절반이 완료됩니다. 인쇄할 때 필드가 구분되는 방식입니다. 다음으로 if(NR==1) $NF="emotional_polarity"나머지 절반을 수행하십시오. 여기서 사용하는 것보다 사용하는 것이 $(NF+1)더 낫긴 하지만요 . $0에 다른 필드를 추가합니다. 이는 NF 값을 1만큼 증가시킵니다. 따라서 명령문은 1행( )의 마지막 필드를 "emotion_ polarity"로 변경합니다. 이제 이 두 표현을 명령에 넣었습니다.$12$12$12=$a+..$bifNR ==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]arr[NR][2]계산을 수행하는 동안 $0 출력을 모두 가져옵니다 .

END블록 에서는 arr[1][2]필드 이름을 Emotional_Polarity로 지정하기 때문에 "emotional_poleity"로 설정했습니다. 그런 다음 인쇄를 알려줍니다 awk.

관련 정보