web-dev-qa-db-ja.com

bashは2つのファイルから共通の行を削除します

2つのファイルがあります(空白行/スペース/タブなし)

/ tmp/all

_aa  
bb  
cc  
hello  
SearchText.json  
xyz.txt  
_

/ tmp/required

_SearchText.json 
_

そして私が望む最終出力は:(/ tmp/allからのすべての珍しい行)

_aa  
bb  
cc  
hello  
xyz.txt 
_

私は以下のコマンドを試しました:-

_# comm -23 /tmp/required /tmp/all_

_SearchText.json
_

_# comm -23 /tmp/all /tmp/required_

_aa  
bb  
cc
hello  
SearchText.json  
xyz.txt  
_

_# comm -13 /tmp/all /tmp/required_

_SearchText.json  
_

_# comm -13 /tmp/required /tmp/all_

_aa  
bb  
cc  
hello  
SearchText.json  
xyz.txt  
_

_# grep -vf /tmp/all /tmp/required_

_# grep -vf /tmp/required /tmp/all_

_aa  
bb  
cc  
hello  
SearchText.json  
xyz.txt  
_

# comm -23 <(sort /tmp/all) <(sort /tmp/required)

_aa  
bb  
cc  
hello  
SearchText.json  
xyz.txt  
_
2
Girish

commの代わりに、 grep を検討してください。

_grep -vxFf /tmp/required /tmp/all
_

これは、ファイル(_-v_)/ tmp/requiredに(_-f_)が存在しない/ tmp/all内の行を要求します。/tmp/all内の行が正規表現として解釈されないようにするために、「固定文字列」_-F_フラグを追加しました。さらに、/ tmp/allの行全体を、/ tmp/requiredの行と一致させる必要があるため、_-x_オプションを使用します。

この方法では、ソートされた入力は必要ありません。

「SearchText.json」行が両方のファイルで正確に一致した場合、comm -23 <(sort ...) <(sort ...)コマンドが機能すると思われます(末尾のスペース(ある場合)。

5
Jeff Schaller