2014-10-16 52 views
2

搜索并替换为2个单独的文件我有点复杂awk问题,我需要解决。使用AWK

我不确定它是否可以被认为是一个两部分问题或有一种方法来解决它在一个步骤。 t基本上是一个由两部分组成的问题。

我有一个具有相同格式的文件的大目录,每个文件有266行。 每个文件的前206行填充了属性信息。 然后下面的60行由202个由逗号分隔的值组成。 这60行的每一行中的第一个位置是一个单词(字符串值),并且这六十行中每一行的最后一个位置都是一个数字(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 

我想改变那些行的最后数值,包含在第二个文件一句话,让自己的文件的结果是:

@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

这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; 
}