2012-11-14 13 views
16

2つのフィールドに2つのファイルを結合する必要があります。しかし、たとえ結合が左外部結合のように失敗したとしても、ファイル1のすべての値を取得する必要があります。unixの2つのファイルに外部結合を残しました

ファイル1:

01|a|jack|d 
02|b|ron|c 
03|d|tom|e 

ファイル2:

01|a|nemesis|f 
02|b|brave|d 
04|d|gorr|h 

出力:使用

01|a|jack|d|nemesis|f 
02|b|ron|c|brave|d 
03|d|tom|e|| 

答えて

19

にですjoin -t '|' file1 file2 -a1

オプション:

t:区切り文字。
a:不対線を印刷する必要があるファイル番号を決定します。

join -t '|' file1 file2 -a2は、右外部結合を実行します。

実行サンプル

[[email protected] test]$ cat f1 
    01|a|jack|d 

    02|b|ron|c 

    03|d|tom|e 
    [[email protected] test]$ cat f2 
    01|a|nemesis|f 

    02|b|brave|d 

    04|d|gorr|h 
    [[email protected] test]$ join -t '|' f1 f2 -a1 
    01|a|jack|d|a|nemesis|f 

    02|b|ron|c|b|brave|d 

    03|d|tom|e 
+1

あなたは正しい、あなたの出力は、彼の出力と一致します。ケースが閉まった。皆さんお元気で。 – shellter

+0

@shellter。まあまあ。 idmの投稿で対処されていないレコードの最後にパイプがありません。それでも、私はこれを、Linuxの外部結合機能を見つけるという大部分の人たちを狙う戦略であると考えています。 –

4

何の質問が尋ねることは前の回答よりも少し複雑であり、このようなものが必要となる正確に実行します。

sed 's/|/:/2' file1 | sort -t: >file1.tmp 
sed 's/|/:/2' file2 | sort -t: >file2.tmp 
join -t':' file1.tmp file2.tmp -a1 -e'|' -o'0,1.2,2.2' | tr ':' '|' 

UNIXのみで参加できます参加を1つのフィールドAFAIKを使用するため、異なるデリミタを使用するファイルを使用して、 "2つのファイルを2つのフィールドに結合" "、この場合は最初の2つのフィールドを使用する必要があります。私はコロンを使用しますしかし、が入力のいずれかに存在する場合は、何か他のものを使用する必要があります。たとえば、タブ文字がプロダクションでの使用に適しています。また、新しいコンパウンドフィールドsort -t:の出力を再ソートします。これは、入力ファイルの例では実世界のデータに違いはありません。 sed 's/|/:/2'は、fileの各行の2番目の出現箇所をコロンで置き換えます。

file1.tmp

01|a:jack|d 
02|b:ron|c 
03|d:tom|e 

file2.tmp

01|a:nemesis|f 
02|b:brave|d 
04|d:gorr|h 

今、私たちはいくつかのより高度なオプションでtrによってフィルタリングjoin出力を使用します。

  • -t':'を暫定コロンを指定しますデリミタ
  • -a1左外部結合
  • は、最終的な出力デリミタN-1回(ここで、Nはfile2.tmpのコロンの右側に結合されたパイプ区切りフィールドの数)を指定します。この場合、N = 2なので1つのパイプ文字になります。
  • -o'0,1.2,2.2'は、出力形式を指定します。
    • 0はfile1.tmpの分野
    • 1.2フィールド2、file2.tmp
  • tr ':' '|'の右側の結腸のすなわちすべて
  • 2.2フィールド2に参加します最後にコロンをパイプに変換して最終出力を行います。

出力は今、前の答えはしなかったかを正確に質問サンプル出力と一致します。

01|a|jack|d|nemesis|f 
02|b|ron|c|brave|d 
03|d|tom|e|| 
+0

よく考え抜かれたレスポンス、細部の優れた説明。 –

関連する問題