次の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 は、0
2 つのファイル間で一致するフィールドをエクスポートします。これが日付です。は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
( //構文)を使用して最初の行をスキップできます。zsh
bash
join -a 1 -a 2 -o 0,1.2,2.2 -e - <(tail -n +2 file1) <(tail -n +2 file2)