【问题标题】:How to search and replace a value in a particular column in unix如何在unix中搜索和替换特定列中的值
【发布时间】:2020-02-12 16:14:49
【问题描述】:

我正在 AIX 中编写一个 shell 脚本,它有一些代码来更新文本文件中的某些值。 文件格式如下图:

# cat $FILE
instance1   13  16
instance2   14  12
instance4   58  76
instance15  44  91
instance102 31  10
instance112 12  38

我正在尝试按实例名称搜索并将第 2 列和第 3 列中的值替换为新值 我可以使用 perl 做到这一点,如下所示:

# for i in `cat $FILE|awk '{print $1}'`;do 
# perl -pi -e "s/`grep -i $i $FILE|awk '{print $2}'`/$NEW_VAL_2/ if /$i/" $FILE

# perl -pi -e "s/`grep -i $i $FILE|awk '{print $3}'`/$NEW_VAL_3/ if /$i/" $FILE
# done

这行得通,但后来我意识到它正在替换每次出现的值。例如,在最后一行中,它替换了第 2 列中的值以及实例名称的最后两个字符。

Example:

    # i = instance112
    # NEW_VAL_2 = 99
    # perl -pi -e "s/`grep -i $i $FILE|awk '{print $2}'`/$NEW_VAL_2/ if /$i/" $FILE

    Output:

        instance199 99  38

如何按实例名称搜索行并仅替换特定列中的值?

【问题讨论】:

    标签: linux shell perl unix aix


    【解决方案1】:

    ITEM 为要修改的实例行。让NV2NV3 成为第二个和第三个字段的新值。

    这是一个例子:

    ITEM=instance102; NV2=100; NV3=80; sed -E -e "s/^${ITEM}(\\s+)(\\S+)(\\s+)(\\S+)(\\s*)\$/${ITEM}\\1${NV2}\\3${NV3}\\5/" $FILE
    

    它还保留了原始的空格字符:无论是制表符、空格还是制表符和空格的组合。即使在不同的行使用不同的间距样式时,它也会保持原始间距。

    【讨论】:

      【解决方案2】:

      这是一个 perl 单行解决方案。在这里使用纯 perl(带有模式匹配)比混合使用 grep、awk 和 perl 更容易、更快捷。

      $ export FILE=foo
      
      $ cat $FILE
      instance1       13      16
      instance2       14      12
      instance4       58      76
      instance15      44      91
      instance102     31      10
      instance112     12      38
      
      $ export i=instance112
      $ export NEW_VAL_2=99
      $ export NEW_VAL_3=11
      
      $ perl -lne 'if ( m{ \A $ENV{i} \t }xms ) { $_ = join "\t", @ENV{ qw( i NEW_VAL_2 NEW_VAL_3 ) }; } print; ' foo
      instance1       13      16
      instance2       14      12
      instance4       58      76
      instance15      44      91
      instance102     31      10
      instance112     99      11
      

      【讨论】:

        【解决方案3】:

        在 awk 中;

        awk -v newval="$NEW_VAL_2" -v i="$i" '
          BEGIN{OFS="\t"}
          $1 == i { $2 = newval } 1' $FILE > newfile
        

        有关-v 的更多信息,请参阅How do I use shell variables in an awk script 以及为什么它比尝试在脚本字符串中间插入变量更好。

        【讨论】:

          猜你喜欢
          • 2011-09-08
          • 1970-01-01
          • 2014-03-14
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 2011-07-14
          • 2017-04-01
          • 2017-01-05
          相关资源
          最近更新 更多