2つのファイルを比較し、fileAの内容がfileBにあることを確認し、数字のみを表示する方法は?

2つのファイルを比較し、fileAの内容がfileBにあることを確認し、数字のみを表示する方法は?

同様の質問をGoogleとウェブサイトで検索してみましたが、目的のものが見つかりませんでした。 2つのファイルがあり、両方とも数字で埋められています。 FileBの行をFileAと比較する方法を知りたいです。 FileBの行がFileAにない場合は無視してください。比較後、FileAの特定のデータだけを印刷したいと思います。より詳しく説明すると、両方ともすでに数字でソートされています。

ファイルA:

103445  -630
103572  -638
107586  -133
109754  -466
111900  -643
112699  -371
112991  -17
113863  -175
114189  -691

ファイルB:

101191  1136
103184  1322
103445  -210
103572  1424
104618  28
105395  1052

ご覧のとおり、Bの1〜2行目はAの行ではないため、完全に無視しています。 BからAの行の最初の6文字だけを保存したいと思います。その後、実行する他のコマンドがいくつかありますが、これを行う方法を知っていると思います。関連データを絞るだけです。

Commを試してみましたが、実際に私が探しているソリューションを提供していません...

編集:次のステップは、col2の値がFileB(abs val)の値の半分以上であることを確認することであるため、他の列データも保持する必要があります。私はそれらだけを最後まで大事にしたい。たとえば、すべてのコマンドを実行した後、これらの条件に一致するFileAからのcol1データのみを印刷する必要があります。上記の現在の例では何も印刷されていませんが、大きなファイルでは1000行の内容が印刷されます。

ベストアンサー1

$ join FileA FileB | awk '{ x = $2; y = $3 } y < 0 { y = -y } x >= y/2 { print $1, $2 }'

サンプルデータが与えられると、joinこれは次の結果をもたらします。

103445 -630 -210
103572 -638 1424

最初の列は結合フィールド、2番目の列はfrom FileA、最後の列はfromですFileB。この手順では、2つのファイルを並べ替える必要があります。

その後、コードはawk最後の2つの列の値を合計として選択し、負のx場合はyそれを無効にします。最初の2つの列を出力するy場合(この列はで提供されています)x >= y/2FileA

このawkビットは次のように短縮できます。

awk '$3 < 0 { $3 = -$3 } $2 >= $3/2 { print $1, $2 }'

ただし、$3後でこの値を出力することを決定すると、不要な内容が修正されます$0

おすすめ記事