使用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?