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

関連情報