2013-10-18 62 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 

,它在我的系統上運行良好。