使用AWK搜索并替换为2个单独的文件

时间:2014-10-16 10:23:04

标签: bash search replace awk

我需要解决一些复杂的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

修改以解决我的问题?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这个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

答案 1 :(得分: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;
}