あるフィールドの内容を別のフィールドの内容に置き換える

あるフィールドの内容を別のフィールドの内容に置き換える

ここでは、区切り文字に基づいて最初の列を分割したいと思います-。最後の列(ここでは列2)は最後の値に基づいて入力する必要があります。値が01orの場合は、99それぞれ2またはに置き換えます1

#input
PE01-02-01  -9
PE01-02-99  -9
PE01-03-01  -9
PE01-03-99  -9
PE01-05-01  -9
PE01-05-99  -9

#output
PE01-02-01  2
PE01-02-99  1
PE01-03-01  2
PE01-03-99  1
PE01-05-01  2
PE01-05-99  1

これを達成する方法についてのアドバイスを提供できますか?最初の列を配列に分解して最後の要素にアクセスし、2番目の列を更新しようとしています。

答え1

ネストを使用すると、やや不思議にこれを行うことができます。条件付き演算子?:(別名三項演算子)

awk '{$2 = $1 ~ /-01$/? 2: $1 ~ /-99$/? 1: $1; print}' input

PE01-02-01 2
PE01-02-99 1
PE01-03-01 2
PE01-03-99 1
PE01-05-01 2
PE01-05-99 1

交互に

awk '{n = split($1, a, "-"); $2 = a[n] == "01" ? 2: a[n] == "99"? 1: a[n]; print}' input

答え2

Perlソリューション:

perl -ane 'BEGIN { $" = "\t" }
           $F[0] =~ /(..)$/,
               $F[-1] = { "01" => 2, "99" => 1 }->{$1} || $F[-1];
           print "@F\n" ' input_file > output_file
  • -n入力を1行ずつ読みます。
  • -a空白の各行を @F 配列に分割します。
  • $""@F"配列メンバーが二重引用符()でタブ区切りになるようにタブに設定します。
  • $F[0]最後の2文字を抽出する正規表現と一致します。$1
  • $F[-1]最後の列は、に従って2または1に設定されます$1$1それ以外の場合は、元の値が保持されます。

関連情報