awk出力の下に表示されている類似ファイルと他のファイルを比較しますか?

awk出力の下に表示されている類似ファイルと他のファイルを比較しますか?

次の2つのファイルを比較し、これら2つのファイル間の比較を示したいと思います。

ファイル1:

DATE       DS 
2012-08-02 1
2013-06-23 1
2013-06-27 2
2013-06-28 2
2013-06-29 779

文書#2:

DATE       DE
2013-06-16 5
2013-06-17 1
2013-06-18 3
2013-06-19 1
2013-06-20 5
2013-06-21 6
2013-06-22 6
2013-06-23 6
2013-06-24 5
2013-06-25 9
2013-06-26 7
2013-06-27 22
2013-06-28 59
2013-06-29 334
2013-06-30 11

文書#1と#2の比較:

DATE       DS   DE 
2012-08-02 -    1
2012-08-05 -    2
2013-06-16 5    -  
2013-06-17 1    -  
2013-06-18 3    -  
2013-06-19 1    -  
2013-06-20 5    -  
2013-06-21 6    -
2013-06-22 6    -
2013-06-23 6    -
2013-06-24 5    -
2013-06-25 9    -
2013-06-26 7    1
2013-06-27 22   2
2013-06-28 59   2
2013-06-29 334  779
2013-06-30 11   -

上記の file1、DATE、および DS は、特定の日付に対して「データ選択」がどのくらいの選択肢を持っているかを示します。ファイル 1 とファイル 2 にも同じ数の「無効」(DE) が表示されますが、日付が異なります。

今AWKを使用してfile1とfile2を表示したいと思います。

どちらのファイルも$ 1の日付、ファイル1の$ 2、ファイル2の$ 2の日付です。特定の日付を比較すると、DE、DAも表示されます。

たとえば、

DATE      DE DS
2012-08-1 -   1 # Date is present in $1 from file1 but file2 is not there. 
                # This is the date I want. Also I want to display a (-) for 
                # DE which is not there.

答え1

おそらく:

join -a 1 -a 2 -o 0,1.2,2.2 -e - file1 file2

上記のコマンドの説明

joinほとんどのLinuxベースのディストリビューションと同様に、GNUシステムを使用している場合は、次のようにオプションを見つけることができます。

$ info coreutils 'join invocation'

または

$ info join

(家庭情報ディレクトリは正しく保持されます)

または確認できますPOSIX仕様Unicesで何が保証されているかを確認してください。

上記のオプションは次のとおりです。

`-a FILE-NUMBER'
     Print a line for each unpairable line in file FILE-NUMBER (either
     `1' or `2'), in addition to the normal output.

これは、日付(結合フィールド)が両方に表示されないペアになっていない行の要件を満たします。

`-o FIELD-LIST'
     Construct each output line according to the format in FIELD-LIST.
     Each element in FIELD-LIST is either the single character `0' or
     has the form M.N where the file number, M, is `1' or `2' and N is
     a positive field number.

このオプションは、各出力ラインに表示されるフォーマットを設定しますjoin。 A は、02 つのファイル間で一致するフィールドをエクスポートします。これが日付です。は1.2、最初のファイル(file1)の2番目の列、2番目の2.2ファイル(file2)の2番目の列です。

`-e STRING'
     Replace those output fields that are missing in the input with
     STRING.

このオプションは、file1またはfile2の不足しているフィールドに使用する文字を指定します。これが-最終出力に生成される理由です。

クロマトグラフィーカラムの使用

@GlennJackmanの提案を活用することで、同じサイズの列に見やすくフォーマットされているように出力をさらに整理できます。

$ join -a 1 -a 2 -o 0,1.2,2.2 -e - file1 file2 | column -t
DATE        DS   DE
2012-08-02  1    -
2013-06-16  -    5
2013-06-17  -    1
2013-06-18  -    3
2013-06-19  -    1
2013-06-20  -    5
2013-06-21  -    6
2013-06-22  -    6
2013-06-23  1    6
2013-06-24  -    5
2013-06-25  -    9
2013-06-26  -    7
2013-06-27  2    22
2013-06-28  2    59
2013-06-29  779  334
2013-06-30  -    11

入力ファイルは結合キーに基づいてソートする必要があります(デフォルトは最初のフィールドです)。上記では、ほとんどのロケールでは「DATE」が「2013」以降にソートされるため、そうではありません。したがって、joinすべての実装で動作が保証されるわけではありません。

ksh93( //構文)を使用して最初の行をスキップできます。zshbash

join -a 1 -a 2 -o 0,1.2,2.2 -e - <(tail -n +2 file1) <(tail -n +2 file2)

関連情報