2つのファイルを比較し、一致する履歴を表示します。

2つのファイルを比較し、一致する履歴を表示します。

あなたの助けが本当に必要です。私はUnixに初めて触れます。 File2(3列)をFile1(元のデータ)と比較し、結果を新しいファイルに保存したいと思います。しかし、私のファイルには異なる区切り文字があります。

例:

File1 (in tab delimited)
Col1    Col2    Col3    Col4    Col5
a       1       JJ      KK      DD
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

File2 (in pipe delimited)
Col1    Col2    Col3
b       TT      RR
c       QQ      ZZ

Result
Col1    Col2    Col3    Col4    Col5
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

私のファイルが大きくて速く実行するにはコードが必要であることに注意してください。 file1と一致するには、file2の列3を一致させる必要があります。ありがとうございます!

答え1

注文する

u=`awk 'NR==1{print $0}' fil1`

awk -v u="$u"  'BEGIN {print u}NR==FNR{a[$3];next}($4 in a){print $0}' fil2 fil1

出力

Col1    Col2    Col3    Col4    Col5
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

答え2

それらをソートし(1)、同じ区切り文字を使用するようにフォーマットし直して(sed(1)など)、カスタムマッチングプログラムを実行して結果を処理できます(私はperl(1)で書くでしょうが、今日もあるかもしれません。

答え3

file1で一致させたい項目(列、行全体、正規表現、文字列、部分、または全体など)を話していないので、これは推測ですが、おそらくそれはあなたが望むものかもしれません(file1の列4はfile2の列3の完全なフィールド文字列の一致です)と同じです。

$ awk 'NR==FNR{a[$3]; next} (FNR==1) || ($4 in a)' FS='[|]' file2 FS='\t' file1
Col1    Col2    Col3    Col4    Col5
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

または、次のようにすることもできます(完全なフィールド文字列一致で、file2のすべての列をfile2の3つの特定の列と順次比較)。

$ awk 'NR==FNR{a[$1,$2,$3]; next} (FNR==1) || (($1,$3,$4) in a)' FS='[|]' file2 FS='\t' file1
Col1    Col2    Col3    Col4    Col5
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

しかし、他の可能性も数十あります。あなたが提供した例の問題は、あなたが投稿したサンプル入力に基づいて期待される出力を生成する一致する組み合わせが多いことです。

答え4

Perlを使用する1つのアプローチは次のとおりです。

 $ perl -F'\t' -lane '$"="|";
     $h{$_}++,next if @ARGV;
     print if $h{"@F[0,2,3]"};
 ' File2 File1

まず、File2を読み込み、パイプシンボルを含むことを思い出しながら、file2の行でハッシュキーを入力します。

次に、file1を読み取り、対応するフィールド0、2、3を一致させ、タブとパイプに分割します。ゲームの場合は、記録を取得します。

関連情報