【问题标题】:Search and replace with 2 separate files using AWK使用 AWK 搜索并替换为 2 个单独的文件
【发布时间】:2014-12-11 16:14:00
【问题描述】:

我有一个复杂的awk 问题需要解决。

我不确定它是否可以被认为是一个两部分的问题,或者有一种方法可以一步解决它。 t 本质上是一个两部分的问题。

我有一个包含相同格式文件的大目录,每个目录有 266 行。 每个文件的前 206 行都填充了属性信息。 然后下面的 60 行包含 202 个用逗号分隔的值。 这六十行中每一行的第一个位置是一个单词(字符串值),这六十行中每一行的最后一个位置是一个数字(1 或 0)。 是否可以更改包含在单独文件中指示的某些字符串的行的最后一个槽 ($202) 数值?

将问题可视化。 我的数据文件如下所示:

@RELATION relationData

@ATTRIBUTE att0 STRING
@ATTRIBUTE att1 NUMERIC
@ATTRIBUTE att2 NUMERIC
@ATTRIBUTE att3 NUMERIC
....
@ATTRIBUTE att200 NUMERIC

@ATTRIBUTE class {1,0}

@DATA
hall,1,2,3,...,201,0
cat,1,2,3,...,201,1
dog,1,2,3,...,201,1
feather,1,2,3,...,201,1

我有一个包含单词列表的第二个文件(每行 1 个):

cat
feather

我想将第二个文件中包含单词的那些行上的最终数值更改为0,这样我的文件结果是:

@RELATION relationData

@ATTRIBUTE att0 STRING
@ATTRIBUTE att1 NUMERIC
@ATTRIBUTE att2 NUMERIC
@ATTRIBUTE att3 NUMERIC
....
@ATTRIBUTE att200 NUMERIC

@ATTRIBUTE class {1,0}

@DATA
hall,1,2,3,...,201,0
cat,1,2,3,...,201,0
dog,1,2,3,...,201,1
feather,1,2,3,...,201,0

关于如何解决问题的任何建议。 例如,可以这样:

awk -v ip1="$INPUT1" -v ip2="$INPUT2" '{gsub( /String1/, ip1);gsub( /String2/, ip2);print}' file

进行修改以解决我的问题?

提前感谢您的帮助。

【问题讨论】:

    标签: bash search replace awk


    【解决方案1】:

    这个 awk 应该可以工作:

    awk -F',' 'FNR==NR {a[$1];next} $1 in a{$NF=0} 1' list.txt file.txt
    @RELATION relationData
    
    @ATTRIBUTE att0 STRING
    @ATTRIBUTE att1 NUMERIC
    @ATTRIBUTE att2 NUMERIC
    @ATTRIBUTE att3 NUMERIC
    ....
    @ATTRIBUTE att200 NUMERIC
    
    @ATTRIBUTE class {1,0}
    
    @DATA
    hall,1,2,3,...,201,0
    cat 1 2 3 ... 201 0
    dog,1,2,3,...,201,1
    feather 1 2 3 ... 201 0
    

    【讨论】:

      【解决方案2】:

      Perl 的救援:

      #!/usr/bin/perl
      use warnings;
      use strict;
      
      open my $LIST, '<', 'list-of-words' or die $!;
      chomp(my @lines = <$LIST>);
      my $regex = join '|', @lines;
      # or, if the "words" can contain special characters:
      # my $regex = join '|', map "\Q$_\E", @lines;
      $regex = qr/^($regex),/;
      
      open my $DATA, '<', 'data-file' or die $!;
      while (<$DATA>) {
          if (/\@DATA/ .. undef) {
              s/,[0-9]+$/,0/ if /$regex/;
          }
          print;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-24
        • 2014-08-06
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多