我想根据分隔符在这里划分第一列-
。应根据最后一个值填充最后一列(此处为第 2 列)。如果值为01
或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
您能否提供有关如何实现这一目标的建议?我试图将第一列分解为数组,访问最后一个元素,然后更新第二列。
答案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
逐行读取输入。-a
将空白处的每一行拆分到 @F 数组中。$"
"@F"
设置为制表符,以便数组成员用双引号 ( )制表符分隔$F[0]
与正则表达式匹配,该正则表达式将其最后两个字符提取到$1
$F[-1]
最后一列 ,根据 被设置为 2 或 1$1
。如果$1
是其他值,则保留原始值。