2017-03-21 44 views
1

2つのファイルがあります。 file1およびfile2。 File1には多くの行/行と列があります。 File2には1行しかなく、いくつかの行/行があります。 file2の文字列はすべてfile1にあります。 file2のいずれかの文字列を含むfile1の行が削除されるように、新しいファイル(file3)を作成します。例えばfile2の列一致に基づいてfile1の行を削除する方法

はFile1:

Sally ate 083 popcorn 

Rick has 241 cars 

John won 505 dollars 

Bruce knows 121 people 

File2の:

083 

121 

希望FILE3:私は、文字列を入力する必要はありません

Rick has 241 cars 

John won 505 dollars 

注意ファイル2を通信に変換する手動で(実際のファイルはこの例よりもはるかに大きくなります)。

ありがとうございます!

答えて

1

awkのアプローチよりも優れ:

awk 'BEGIN{p=""}FNR==NR{if(!/^$/){p=p$0"|"} next} $0!~substr(p, 1, length(p)-1)' file2 file1 > file3 

FNR==NRからすべての列の値を含むパターンとして扱わ

p=""変数は、次式がfile2

if(!/^$/){p=p$0"|"}、すなわち第一の入力ファイルに対して行う手段であることを確実にする:それは空行!/^$/ない場合(ASそれはあなたの入力によるかもしれません)|のパターン部分を連結するようになりますので、最終的には083|121|

$0!~substr(p, 1, length(p)-1)のようになります第2の入力ファイル(file1)はパターンと一致しない(すなわち、あなたは部分一致を防ぐために、同様に `-w`オプションを追加することもでき

Rick has 241 cars 

John won 505 dollars 
1

これを試してみてください -

#cat f1 
Sally ate 083 popcorn 
Rick has 241 cars 
John won 505 dollars 
Bruce knows 121 people 

#cat f2 
083 
121 

#grep -vwf f2 f1 
Rick has 241 cars 
John won 505 dollars 
1

grepスイートあなたの目的ラインエディタ

grep -v -f File2 File1 >File3 
+0

file2列値)


file3内容。 – codeforester

関連する問題