異なるファイルの2列の単語を比較してインポートします。

異なるファイルの2列の単語を比較してインポートします。

異なるファイルの2つの異なる列を比較し、その中に共通の項目をインポートしたいと思います。

ファイル1

abc
123
ttt
kkk

ファイル2

111 wed
222 kad
333 ttt
444 kkk

1列を比較したいファイル12列に移動ファイル2。共通項目がある場合は、file2に一致する行を印刷したいと思います。

予想される結果:

333 ttt
444 kkk

結果を得るために、次のコマンドを試しました。

awk -F 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2

または

join -t -1 1 -2 2 -o 2.1,2.2 file1 file2

しかし、期待した結果は得られません。

答え1

awk 'NR==FNR {a[$1]; next} $2 in a' file1 file2
333 ttt
444 kkk

上記は欲しいものです。to compare column 1 of file1 to column 2 of file2. If there are any common entries, I want to print the match lines from file2

答え2

awk2つのフィールドをキーとして使用するため失敗しますが、フィールドはfile11つだけなので、2つのフィールドは配列cに表示されません。また、-Fフィールド区切り文字を提供しますが、実際にはフィールド区切り文字を提供しないオプションを使用しています。これは、フィールド区切り文字がawkスクリプト自体になることを意味します。

awk -F 'script' file

あなたが試している作業バージョンは次のとおりですawk

$ awk  'NR==FNR{c[$1]++;next};c[$2] ' file1 file2
333 ttt
444 kkk

必要以上のメモリを使用しないより効率的なバージョンは次のとおりです。

$ awk  'NR==FNR{c[$1]}; $2 in c' file1 file2 
333 ttt                 
444 kkk   

joinまた、このオプションを誤用しました-t-F同様にawk-t引数を受け取りますが、引数を提供しません。次に、join入力をソートするように求められます。あなたの方法の動作バージョンは次のとおりですjoin

$ join  -1 1 -2 2 -o 2.1,2.2 <(sort file1) <(sort -k2 file2)
444 kkk
333 ttt

答え3

使用csvjoin(ツールセットの一部csvkit):

file1 が次のようになるとします。

x
abc
123
ttt
kkk

file2 は次のようになります。

y x
111 wed
222 kad
333 ttt
444 kkk

次のコマンドを使用できます。

csvjoin -d' ' -c x file{2,1} | tr ',' ' '
  • -d' '区切り文字としてスペースを使用します。

  • -c xcsvjoinは列を使用してファイルを結合しますx

@terdonがヘッダーのないファイルの上記のコマンドを修正しました。コマンドは次のように変更できます。

csvjoin -H -d ' ' -c 2,1 fil{2,1} | tr ',' ' ' | tail -n +2

上記のコマンドは、-Hヘッダー(パラメータ)を持たないファイルに対して機能します。

コマンドはtail2番目のレコード()から出力を開始します+2。これはcsvjoin、コマンドが出力の先頭に新しいヘッダー行を追加するためです。

答え4

#!/usr/bin/python
k1=open('file1','r')
for f1 in k1:
    k2=open('file2','r')
    for f2 in k2:
        if f1.strip() in f2.strip():
            print f2.strip()
~                                  

出力

333 ttt
444 kkk

関連情報