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
配列に保存しますa
。NR
(これまでに見た入力レコードの総数)が(現在の入力ファイルの入力レコード数)と同じであることを確認して、最初のファイルを読み込んでいるかどうかを検出FNR
します。
次に(2番目のファイル名パラメータ)を読み、最初のフィールドが配列file1
にある場合は、一致するa
入力行を印刷します(awk
たとえば、成功したテスト結果の基本的な操作は$1 in a
入力行を印刷することです$1 in a
)。$1 in a {print}
。
しかし、ほとんどの場合、このようなことができますが、grep -f file2 file1
これはfile2の内容と一致します。どこかにin file1 - たとえばc
from file2 は と一致するだけでcat
なくjack
file1 でも一致します。
答え3
次のオプションを使用して 'のオプションを使用するgrep
ソリューション(CASが提案したように):-f
sed
$ grep -f <(sed 's/^/^/' file2) file1
c cat
e eagle
f fire
コマンドは、各行の先頭にsed 's/^/^/' file2
カラットを追加します。手続き型置換()オプションを使用して、この出力をパターン入力ファイルとして使用します。^
file2
grep
-f
<(…)
このコマンドは、コマンド置換パターンに一致するgrep
行を印刷します。その行に一致するには、パターンの文字がfile1
必要です。^
スタート与えられたキャラクターで。