0

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

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

因此,例如,如果file2包含名称Harry并且file1看起来像:

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  

有谁知道如何做到这一点?

4

3 回答 3

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都在一个新行上)

于 2013-10-18T12:12:03.940 回答
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

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

于 2013-10-18T14:39:11.650 回答
-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
于 2013-10-18T12:25:45.633 回答