ここでは、区切り文字に基づいて最初の列を分割したいと思います-
。最後の列(ここでは列2)は最後の値に基づいて入力する必要があります。値が01
orの場合は、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
それ以外の場合は、元の値が保持されます。