0

file1複数の行とフィールドにまたがる多数の人々の情報を含むファイルがあり、各人にも複数のエントリがあります。さらにfile2、人の名前のリストを含む別のファイルがあります。

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  

これをどのように行うことができるか、誰にもアイデアがありますか?

4

3 に答える 3

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新しい行にあると想定しています)

于 2013-10-18T12:12:03.940 に答える
-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
于 2013-10-18T12:25:45.633 に答える