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

使用awk编辑包含文件2内容的文件1,awk,Awk,我有一个文件file1,其中包含许多人的一些信息,这些信息分布在多行和多个字段中,每个人也会有多个条目。 此外,我还有另一个文件file2,其中包含人名列表 我想使用file2中的名称删除file1中的所有相应条目。(或者反过来,file2可以是要保留的名称列表?) 例如,如果file2包含名称Harry和file1如下所示: name Tom info field1 field2 field3….. field1 field2 field3….. field1 f

我有一个文件
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  
有人知道如何做到这一点吗?

尝试以下方法:

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
} 
开始{
而((getline<“names.txt”)>0){
sub(/[\t]*$/,“”,line)#如果有尾随空格。。
名称[行]+;
}
}
((NR-1)%7)=0{i=0}
((NR-1)%7)=1{rname=$1}
{rec[i++]=$0}
((NR-1)%7)=6{
如果(!(名称中的rname)){

对于(j=0;j),该方法没有假设每个人的每个条目只有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

n=`cat names.dat | wc-l`;awk-v len=“$n”开始{bPrint=1;}{if(NR这里尝试使用
sed
后跟
pcregrep

首先使用
sed
file2
创建一个包含所需搜索模式列表的文件。假设输出文件名为
search\u 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

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

记录是否总是以
name
开头的单行?您尝试过什么吗?为什么特别是AWK?