2017-01-25 10 views
3

私は2つのCソースファイルに多くの定義があり、それらをお互いに比較し、一致しない行をフィルターに掛けたいと思います。2つのgrepの出力を比較する

状の第2ルックスのはgrep( grep "define NO_BCM" include/sdk_custom_config.h
... 
... 
# if !defined(NO_BCM_5675_A0) 
# if !defined(NO_BCM_88660_A0) 
# if !defined(NO_BCM_2801PM_A0) 
... 
... 

... 
... 
#define NO_BCM_56260_B0 
#define NO_BCM_5675_A0 
#define NO_BCM_56160_A0 
... 
... 

は、だから今、私は、任意のタイプの番号を見つけたい最初のファイルの のgrep(grep NO_BCM_ include/soc/mcm/allenum.h | grep -v 56440)出力は次のようになります。上記の中かっこは#define以下にありません。これについてはどうしたらいいですか? は

+0

'差分ファイル1 file2' –

+0

含めるための[編集]あなたの質問入力が与えられると期待される出力。 –

答えて

4

あなたはアイデアが<()内のコマンドを実行し、必要に応じて出力を生成しますですgrep

awk 'FNR==NR{seen[$2]; next}!($2 in seen)' FS=" " <(grep "define NO_BCM" include/sdk_custom_config.h) FS="[()]" <(grep NO_BCM_ include/soc/mcm/allenum.h | grep -v 56440) 
# if !defined(NO_BCM_88660_A0) 
# if !defined(NO_BCM_2801PM_A0) 

のために2つのプロセス置換ハンドラでawkロジックを使用することができます。出力が共通エンティティが適切な区切り文字で確実に解析されるようにする前に、FSを使用します。

FS="[()]"は、第2グループのユニークフィールドとしてキャプチャし、最初のグループのデフォルトの空白を制限解除する場合はFS=" "をキャプチャします。

コアロジックawkは、繰り返し要素ではないことを示しています。すなわち、FNR==NRは、$2の一意のエントリを格納する最初のグループをハッシュマップとして解析します。すべての行が解析されると、!($2 in seen)が2番目のグループで実行されます。これは、2番目のグループの$2が作成されたハッシュに存在しない行をフィルタリングすることを意味します。

+1

@エドモートン:ありがとうエド!更新しました! – Inian

4

使用commこの方法をありがとう:

comm -23 <(grep NO_BCM_ include/soc/mcm/allenum.h | cut -f2 -d'(' | cut -f1 -d')' | sort) <(grep "define NO_BCM" include/sdk_custom_config.h | cut -f2 -d' ' | sort) 

これはinclude/soc/mcm/allenum.hにユニークなトークンを与えるだろう。

出力:あなたは、そのファイルからのフルラインをしたい場合は

NO_BCM_2801PM_A0 
NO_BCM_88660_A0 

、あなたが使用することができfgrep

fgrep -f <(comm -23 <(grep NO_BCM_ include/soc/mcm/allenum.h | cut -f2 -d'(' | cut -f1 -d')' | sort) <(grep "define NO_BCM" include/sdk_custom_config.h | cut -f2 -d' ' | sort)) include/soc/mcm/allenum.h 

出力:

# if !defined(NO_BCM_88660_A0) 
# if !defined(NO_BCM_2801PM_A0) 

についてcomm

NAME COMM - ラインで2つのソートファイルの行を比較

書式 COMM [OPTION] ... FILE1 FILE2

説明 は、ソートされたファイルにラインによってFILE1とFILE2ラインを比較してください。

With no options, produce three-column output. Column one contains lines unique to FILE1, column two contains lines unique to 

FILE2、および3列目には、両方のファイルに共通の行が含まれています。

-1  suppress column 1 (lines unique to FILE1) 
    -2  suppress column 2 (lines unique to FILE2) 
    -3  suppress column 3 (lines that appear in both files) 
3

それはあなたのサンプル入力ファイルから周囲の文脈なし期待される出力せずに言うのは難しいのですが、これはあなたが必要とするすべてであるように聞こえる:

awk '!/define.*NO_BCM_/{next} NR==FNR{defined[$2];next} !($2 in defined)' include/sdk_custom_config.h FS='[()]' include/soc/mcm/allenum.h 
+0

:grepとは無関係に+1、FS = '[()]は[]内の任意の1文字を指定するためのもので、スペース区切りにすることができます。 – Vicky

+0

ファイルの場合は、(コロン)、(カンマ)、| (パイプ)文字と私はフィールドのセパレータとして私はそれらをすべて扱うようにしたい私はFSとしてFSを指定することはできます= [:、|]? – Vicky

+1

@ user3369871が正しい場合、ブラケット式には、説明したとおりの文字リスト、および/または文字クラスや文字範囲を含めることができ、それらはそのブラケット式で記述された任意の1文字と一致します。 –

関連する問題