共通フィールドに基づいて2つのファイルをリンクし、コマンドを使用してファイルに出力しようとしていますjoin
。
ファイル1:
C01:Nancy:Jones:[email protected]
C02:Barbara:Madison:[email protected]
C03:Tim:Adams:[email protected]
C04:Sarah:Moore:[email protected]
C05:John:Polk:[email protected]
C06:Paula:Jacobs:[email protected]
ファイル2:
R001:07/04/15:123.45:C01
R002:12/20/15:167.50:C03
R003:03/14/16:298.00:C06
R005:09/15/16:36.50:C03
R005:11/27/16:58.00:C02
R006:02/28/17:72.98:C05
期待される出力
C01:Nancy:Jones:[email protected]:R001:07/04/15:123.45
C02:Barbara:Madison:[email protected]:R005:11/27/16:58.00
C03:Tim:Adams:[email protected]:R002:12/20/15:167.50
C03:Tim:Adams:[email protected]:R004:09/15/16:36.5
C05:John:Polk:[email protected]:R006:02/28/17:72.9
C06:Paula:Jacobs:[email protected]:R003:03/14/16:298.00
まず、フィールド4に基づいてソートし、新しいファイルに出力しFile2
ました。
sort -t: -k 4 File2 > File22
それからサインアップ
join -t: -1 1 -2 4 -o '1.1 1.2 1.3 1.4 2.1 2.2 2.3' File1 File22 > File 3
ただし、常に空の出力ファイルが表示されます。また、行方不明を処理する方法がわからない。4号線fromFile1
とこの事実C03
はに2回表示されますFile2
。
ベストアンサー1
必要な方法でタスクを実行するには、2つのタスクを実行する必要があります。> File 3
まず、出力をコマンドにリダイレクトFile
し、コマンドの最後に追加のパラメータを追加して、コマンドに3
追加のパラメータを追加できます。join
なぜこれが起こるのかを説明するために、最近(偶然!)同様の質問に答えました。マニュアルページリダイレクトの奇妙な動作。デフォルトでは Bash 構文に関する内容で、 で詳細を読むことができますman bash
。
動作を変更するには、出力ファイルにスペースがないことを確認するか、スペースをエスケープするか、ファイル名を引用符で囲む必要があります。次のリダイレクトのいずれかが機能します。
... > File3
... > File\ 3
... > "File 3"
これで、出力から欠落しているレコードを修正します。これは-a
フラグによって処理されます。からman join
:
-a FILENUM also print unpairable lines from file FILENUM, where FILENUM is 1 or 2, corresponding to FILE1 or FILE2
tee
要約すると、次のコマンドは私にとって効果的でした(出力を表示するためにリダイレクトの代わりに使用します)。
$ join -t: -1 1 -2 4 -o '1.1 1.2 1.3 1.4 2.1 2.2 2.3' -a 1 File1 <(sort -t: -k4 File2) | tee "File 3"
C01:Nancy:Jones:[email protected] :R001:07/04/15:123.45
C02:Barbara:Madison:[email protected] :R005:11/27/16:58.00
C03:Tim:Adams:[email protected]:R002:12/20/15:167.50
C03:Tim:Adams:[email protected]:R005:09/15/16:36.50
C04:Sarah:Moore:[email protected]:::
C05:John:Polk:[email protected]:::
C06:Paula:Jacobs:[email protected]:R003:03/14/16:298.00