使用awk编辑文件2的内容为文件1

时间:2013-10-18 11:41:28

标签: awk

我有一个文件file1,其中包含多个人的一些信息,这些信息分布在多个行和字段中,每个人也会有多个条目。 另外,我有另一个文件file2,其中包含人名的列表。

我想使用file2中的名称删除file1 中的所有相应条目。 (或者相反,file2可能是要保留的名称列表?)​​

例如,如果file2包含名称Harryfile1,则显示如下:

name  
Tom  
info  
field1  field2  field3…..  
field1  field2  field3…..  
field1  field2  field3…..  
1234  
name
Dick  
info   
field1  field2  field3…..  
field1  field2  field3…..  
field1  field2  field3…..  
8765  
name 
Harry  
info 
field1  field2  field3…..  
field1  field2  field3…..  
field1  field2  field3…..  
5678  
name
Tom  
info
field1  field2  field3…..  
field1  field2  field3…..  
field1  field2  field3…..  
9876  

然后我的输出将是:

name  
Tom  
info  
field1  field2  field3…..  
field1  field2  field3…..  
field1  field2  field3…..  
1234  
name
Dick  
info   
field1  field2  field3…..  
field1  field2  field3…..  
field1  field2  field3…..  
8765  
name 
Tom  
info
field1  field2  field3…..  
field1  field2  field3…..  
field1  field2  field3…..  
9876  

有没有人有任何想法如何做到这一点?

3 个答案:

答案 0 :(得分:1)

尝试以下方法:

awk -f rem.awk input.txt

其中input.txt是您的输入文件,rem.awk

BEGIN {
    while ((getline line < "names.txt") > 0) {
        sub(/[ \t]*$/,"",line) #In case there are trailing spaces..
        name[line]++;
    }
}

((NR-1) % 7)==0 {i=0}
((NR-1) % 7)==1 {rname=$1}
{rec[i++]=$0}

((NR-1) % 7)==6 { 
    if (! (rname in name)) {
        for (j=0; j<=6; j++) {
            print rec[j]
        }
    }
    next
} 

names.txt是带有名称的文件..(注意:程序假定names.txt中的每个名称都在新行上)

答案 1 :(得分:1)

以下是使用sed后跟pcregrep

的尝试

首先使用file2创建一个包含sed所需搜索模式列表的文件。假设输出文件名为search_names

sed -r 's/(\w+)/name.*?\\n\1.*?(\\n|.)*?\\d{4}/' file2 | tee search_names

然后,您可以使用-f选项将创建的模式文件提供给pcregrep。使用-M选项进行多行搜索。

删除条目 - 使用-v反转匹配

pcregrep -vM -f search_names file1

保留条目

pcregrep -M -f search_names file1

使用您的示例输入测试上述命令,它在我的系统上运行良好。

答案 2 :(得分:-1)

这种方法没有假设每个人的每个条目只有7行。

n=`cat names.dat | wc -l` ; awk -v len="$n" ' BEGIN {bPrint = 1; }  { if (NR <= len) { a[$1]=$1 ; } else {     if ($0 == "name") { if (bPrint) print ; bPrint = 1 ;  }     else { if (a[$1] != "" ) { bPrint = 0 ; }   if (bPrint) print ; } } }  ' names.dat a.dat