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

==2 つのオペランドの値が等しいかどうかをチェックし、=右側のオペランドの値を左側のオペランドに割り当てます。次の行が機能するはずです。

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

条件が指定されていない場合は、それぞれのメインが常に実行されます。

答え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

関連情報