2013-10-18 134 views
0

我有一个文件file1包含一些人的信息分散在多个行和领域,并且也将有多个条目为每个人。 另外我有另一个文件file2包含民族名称列表。编辑文件1与文件2的内容使用awk

我想用名称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 

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

+0

一条记录是否始终以单行上的'name'开头? – 2013-10-18 12:11:55

+1

你尝试过什么吗?为什么特指AWK? – SriniV

回答

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

这种方法并没有假设每个人的每个条目都有o只有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 
1

下面是使用sed其次是pcregrep

尝试首先使用sedfile2与期望的搜索模式的列表中的文件。比方说,输出文件名为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 

,它在我的系统上运行良好。