
異なるファイルの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
awk
2つのフィールドをキーとして使用するため失敗しますが、フィールドはfile1
1つだけなので、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 x
csvjoinは列を使用してファイルを結合しますx
。
@terdonがヘッダーのないファイルの上記のコマンドを修正しました。コマンドは次のように変更できます。
csvjoin -H -d ' ' -c 2,1 fil{2,1} | tr ',' ' ' | tail -n +2
上記のコマンドは、-H
ヘッダー(パラメータ)を持たないファイルに対して機能します。
コマンドはtail
2番目のレコード()から出力を開始します+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