我想比较以下 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
语法)跳过第一行:zsh
bash
join -a 1 -a 2 -o 0,1.2,2.2 -e - <(tail -n +2 file1) <(tail -n +2 file2)