比较 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如果在 GNU 系统上(像大多数基于 Linux 的发行版一样),您可以使用以下命令找到选项:

$ 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。 A0发出两个文件之间匹配的字段。这是日期。是1.2第一个文件 (file1) 的第二列,2.2是第二个文件 (file2) 的第二列。

`-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)

相关内容