awk의 if else 문을 사용하여 기존 열을 기반으로 새 열을 만듭니다.

awk의 if else 문을 사용하여 기존 열을 기반으로 새 열을 만듭니다.

700만 개가 넘는 행(실제로는 20개 이상의 열)이 있는 데이터세트가 있고 새 열(데이터세트 예에는 5개 열이 있음)을 생성하려고 하므로 숫자 6이 됩니다. 내 데이터 세트에는 제목이 있습니다.

조건은 다음과 같습니다. 열 1의 값이 열 3의 값보다 크면 새 열은 열 1의 값을 가져야 하며 그렇지 않은 경우 해당 값은 "1에서 열 1의 값을 뺀 값"이어야 합니다.

나는 이것을 시도했지만 작동하지 않습니다.

awk '{ if ($1 > $3) $6 == $1}; else $6 == 1-$1}' test.txt > test2.txt

데이터 세트(예):

col1 col2 col3 col4 col5
1 3 4 string string
4 2 1 string string

행 1의 경우 col6은 1-1 =이어야 0하고 행 2의 경우 col6은 이어야 합니다 4.

답변1

==두 피연산자의 값이 같은지 확인하고 =오른쪽 피연산자의 값을 왼쪽 피연산자에 대입합니다. 다음 줄이 작동합니다.

awk '{ if($1>$3) $6=$1; else $6=1-$1; print $0; } ' test01 > test02 

또는:

awk '$1>$3{ $6=$1; print $0; } $1<$3{ $6=1-$1; print $0; }' test01 > test02 

awk이것이 작동하기 때문에 :

awk 'condition1{main1} condition2{main2} ... conditionN{mainN}' file.txt

조건이 주어지지 않으면 해당 main이 항상 실행됩니다.

답변2

이 시도. 중괄호 ==로 바꾸고 추가하면 됩니다 .=

awk '{ if ($1 > $3){ $6=$1 }else{ $6=1-$1 } print }' test.txt >test2.txt

답변3

$ awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
             { $(NF+1) = $1      }
    $1 <= $3 { $NF     = 1 - $NF } 1' file
col1 col2 col3 col4 col5 newcol
1 3 4 string string 0
4 2 1 string string 4

스크립트는 새 열 머리글을 추가하고 출력한 후 awk다른 행에 대한 새 열의 값을 계산하기 시작합니다.

값은 먼저 열 1의 값으로 설정한 다음 열 1이 열 3보다 작거나 같으면 1에서 값을 빼서 계산됩니다. 1끝에 있는 단일 문자로 인해 수정된 레코드(라인)가 인쇄됩니다.

$(NF + 1)("마지막 필드 뒤의 필드")에 값을 할당하면 현재 행에 추가 열이 추가되고 NF(현재 레코드의 필드 수)도 늘어납니다.

분명히 명시적인 - 문을 사용하여 이 작업을 수행할 수도 있습니다 if.

awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
    { if ($1 > $3) $(NF+1) = $1; else $(NF+1) = 1 - $1 } 1' file

관련 정보