28

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

ファイル 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||
4

3 に答える 3

31

これはjoin -t '|' file1 file2 -a1

使用したオプション:

t : 区切り文字。
a : ペアになっていない行を出力する必要があるファイル番号を決定します。

join -t '|' file1 file2 -a2右外部結合を行います。

サンプルラン

   [aman@aman test]$ cat f1  
    01|a|jack|d

    02|b|ron|c

    03|d|tom|e
    [aman@aman test]$ cat f2
    01|a|nemesis|f

    02|b|brave|d

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

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

    03|d|tom|e
于 2012-11-14T16:23:38.170 に答える
10

質問が求めることを正確に行うには、以前の回答よりも少し複雑で、次のようなものが必要になります。

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 結合は、AFAIK の単一フィールドでのみ結合できるため、別の区切り文字を使用するファイルを使用して、「2 つのフィールドで 2 つのファイルを結合する」(この場合は最初の 2 つのフィールド) 必要があります。コロン:を使用しますが、入力のいずれかに:が存在する場合は、何か他のものを使用する必要があります。たとえば、本番環境での使用にはタブ文字の方が適している可能性があります。また、新しい複合フィールド で出力を再ソートしますsort -t:。入力ファイルの例では違いはありませんが、実際のデータでは違います。sed 's/|/:/2'ファイルの各行で 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

次に、いくつかの高度なオプションを使用してjoinフィルター処理された出力を使用します。tr

  • -t':'中間コロン区切り文字を指定する
  • -a1左外部結合
  • -e'|'失敗した結合の置換文字列を指定します。基本的には、最終的な出力区切り文字の N-1 回を指定します。N は、file2.tmp のコロンの右側に結合されたパイプ区切りフィールドの数です。この場合、N=2 なので 1 つのパイプ文字です。
  • -o'0,1.2,2.2'出力形式を指定します。
    • 0フィールドに参加
    • 1.2file1.tmp のフィールド 2、つまりコロンの右側のすべて
    • 2.2file2.tmp のフィールド 2
  • tr ':' '|'最後に、最終出力のためにコロンをパイプに変換します。

出力は、前の回答では一致しなかった質問のサンプル出力と正確に一致するようになりました。

01|a|jack|d|nemesis|f
02|b|ron|c|brave|d
03|d|tom|e||
于 2016-10-14T17:41:50.407 に答える