何の質問が尋ねることは前の回答よりも少し複雑であり、このようなものが必要となる正確に実行します。
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||
出典
2016-10-14 17:41:50
idm
あなたは正しい、あなたの出力は、彼の出力と一致します。ケースが閉まった。皆さんお元気で。 – shellter
@shellter。まあまあ。 idmの投稿で対処されていないレコードの最後にパイプがありません。それでも、私はこれを、Linuxの外部結合機能を見つけるという大部分の人たちを狙う戦略であると考えています。 –