不均等な列を持つ2つのファイルの交点:共通列を持つ行を印刷します。

不均等な列を持つ2つのファイルの交点:共通列を持つ行を印刷します。

2つのファイルを比較し、各ファイルの列1の間で共通の行を見つけ、ファイル1の行全体(複数の列)を印刷したいと思います。

ファイル1:

りんご
電子ワシ
グリーン   
はま   
私のイグルー
ジェイジャック

そして

ファイル2:

第二
D
金利
F

出力が次のようになります。


電子ワシ

どんな助けでも大変感謝します。

答え1

これはcoreutilsの仕事です:-)

ファイルがすでにソートされていて、最初の列にパブリックフィールドがある場合:

$ join file1 file2
c cat
e eagle
f fire

ファイルがソートされていない場合:

join <(sort file1) <(sort file2)

答え2

$ awk 'NR==FNR { a[$1]++ ; next}; $1 in a' file2 file1
c   cat
e   eagle
f   fire

これは(最初のファイル名パラメータ)を読み取り、file2配列に保存しますaNR(これまでに見た入力レコードの総数)が(現在の入力ファイルの入力レコード数)と同じであることを確認して、最初のファイルを読み込んでいるかどうかを検出FNRします。

次に(2番目のファイル名パラメータ)を読み、最初のフィールドが配列file1にある場合は、一致するa入力行を印刷します(awkたとえば、成功したテスト結果の基本的な操作は$1 in a入力行を印刷することです$1 in a)。$1 in a {print}


しかし、ほとんどの場合、このようなことができますが、grep -f file2 file1これはfile2の内容と一致します。どこかにin file1 - たとえばcfrom file2 は と一致するだけでcatなくjackfile1 でも一致します。

答え3

次のオプションを使用して 'のオプションを使用するgrepソリューション(CASが提案したように):-fsed

$ grep -f <(sed 's/^/^/' file2) file1
c   cat
e   eagle
f   fire

コマンドは、各行の先頭にsed 's/^/^/' file2カラットを追加します。手続き型置換()オプションを使用して、この出力をパターン入力ファイルとして使用します。^file2grep-f<(…)

このコマンドは、コマンド置換パターンに一致するgrep行を印刷します。その行に一致するには、パターンの文字がfile1必要です。^スタート与えられたキャラクターで。

関連情報