我有一个文件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
有没有人有任何想法如何做到这一点?
答案 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