根据一个字段的内容替换另一字段的内容

根据一个字段的内容替换另一字段的内容

我想根据分隔符在这里划分第一列-。应根据最后一个值填充最后一列(此处为第 2 列)。如果值为0199则分别替换为21

#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是其他值,则保留原始值。

相关内容