2016-07-15 6 views
2

私は2つのファイルを持っています。私は3番目の列に共通のデータを持つ行を取り出したいと思います。しかし、それは一致しなければならない行を残している。bash Joinコマンド、数値の行を残す

はFile1

b b b 
4 5 3 
c c c 

File2の

1 2 3 4 
a b c d 
e f g h 
i j k l 
l m n o 

出力は次のとおり

c c c a b d 

使用するコマンドである:

join -1 3 -2 3 --nocheck-order File1.txt File2.txt 

それも--nocheck次

編集配置した後、一般的なフィールドとして3を持つ行を逃している:

予想される出力:

c c c a b d 
3 4 5 1 2 4 
+0

分で編集します。 –

+0

'join'コマンドは、その入力を結合キーでソートする必要があります。あなたの 'File1.txt'は3番目の列にソートされていません。 –

答えて

2

、あなたはこの単一awkを使用することができますあなたの出力を取得するためのコマンド:

awk 'FNR == NR{a[$3]=$0; next} $3 in a{print $3, a[$3], $1, $2, $4}' file1 file2 

3 4 5 3 1 2 4 
c c c c a b d 

説明:

NR == FNR {     # While processing the first file 
    a[$3] = $0     # store the whole line in array a using $3 as key 
    next 
} 

$3 in a {     # while processing the 2nd file, when $3 is found in array 
    print $3,a[$3],$1,$2,$4 # print relevant fields from file2 and the remembered 
          # value from the first file. 
} 
+0

もう少し説明してもらえますか?他の答えで言及したように、awkの仕組みを理解していません。 特にFNR == NR {a [$ 3] = $ 0;次へ} –

+0

答えに説明を追加しました。出力に共通の列を出力したい場合は、 'print'行を' print $ 3'に置き換えてください。 – anubhava

+1

@anubhavaに感謝し、upvotedして受け入れてください、その答えは私が楽しみにしていたものです。 –

1

あなたはあなたの入力をソートする必要が(例えば)process substitutionを使用した:これは同等です

$ join -1 3 -2 3 <(sort -k3 1.txt) <(sort -k3 2.txt) 
3 4 5 1 2 4 
c c c a b d 

:2つのsortコマンド(大きなファイルのために非常に高価になることができます)、その後joinに代わるものとして

$ sort -k3 1.txt > 1-sorted.txt 
$ sort -k3 2.txt > 2-sorted.txt 
$ join -1 3 -2 3 1-sorted.txt 2-sorted.txt 
3 4 5 1 2 4 
c c c a b d 
+0

それはそうですが、--nocheck-orderがそれを気にするべきではありませんか? –

+0

@BhavyaAroraいいえ、それは単にそれがしているチェックを抑制する。それでもソートされた入力を前提としています。アイデアは、入力がソートされていることを知っていれば、チェックしないことでいくらかスピードを上げることができるということです。 –

+0

ソートせずに共通の要素を3番目の列から取得する方法はありますか?アルゴリズムの実行時間が長くなります。たぶんあなたが示唆できる他のコマンドがあります。 –

関連する問題