Unix:在两个时间序列中找到所有具有时间戳的行?

标签 unix vim awk sed vimdiff

我有时间序列数据,我想在其中找到所有相互匹配的行,但值可能不同(匹配到第一个选项卡)!您可以在下面看到 vimdiff,我想在其中摆脱仅出现在其他时间序列上的日子。

我正在寻找最简单的 unix 工具来完成这项工作!

enter image description here

enter image description here

时间序列herehere .

简单示例

Input

Left file                            Right File    
------------------------             ------------------------
10-Apr-00     00:00    0     ||      10-Apr-00     00:00     7
20-Apr 00     00:00    7     ||      21-Apr-00     00:00     3

Output

Left file                           Right File    
------------------------            ------------------------
10-Apr-00     00:00    0    ||      10-Apr-00     00:00     7

最佳答案

让我们考虑这些示例输入文件:

$ cat file1
10-Apr-00       00:00   0
20-Apr-00       00:00   7
$ cat file2
10-Apr-00       00:00   7
21-Apr-00       00:00   3

将具有相同日期的行合并在一起:

$ awk 'NR==FNR{a[$1]=$0;next;} {if ($1 in a) print a[$1]"\t||\t"$0;}' file1 file2
10-Apr-00       00:00   0       ||      10-Apr-00       00:00   7

说明

  • NR==FNR{a[$1]=$0;next;}

    NR 是到目前为止读取的行数,FNR 是到目前为止从当前文件读取的行数。所以,当 NR==FNR 时,我们仍然在读取第一个文件。如果是这样,将整行 $0 保存在第一个字段 $1 的键下的数组 a 中,这是日期。然后,跳过其余命令并跳转到行。

  • if ($1 in a) 打印 a[$1]"\t||\t"$0

    如果我们到达这里,那么我们正在读取第二个文件,file2。如果这一行的第一个字段$1是我们已经在file1中看到的日期,换句话说,如果$1 in a,那么将此行与 file1 中的相应行一起打印出来。两行之间用tab-||-tab分隔。

替代输出

如果只想从file2中选择日期也在file1中的行,那么代码可以简化:

$ awk 'NR==FNR{a[$1]++;next;} {if ($1 in a) print;}' file1 file2
10-Apr-00       00:00   7

或者,更简单:

$ awk 'NR==FNR{a[$1]++;next;} ($1 in a)' file1 file2
10-Apr-00       00:00   7

关于Unix:在两个时间序列中找到所有具有时间戳的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26964476/

相关文章:

ruby - 在 win7 上的 ruby​​ 文件中运行自动完成时 gVim 崩溃

python - Awk 比较 3 个值,第一个文件值之间的第二个文件值,两个文件之间的多列打印输出到第三个

linux - 将 awk 输出存储在变量中

linux - 如何防止重复输入创建 cron 作业?

linux - 如何使用名字和姓氏查找用户名

vim - 映射 Alt + left|right 以移动选项卡

linux - 使用 awk 搜索多个条件字符串

unix - 修改 zip 文件 md5 哈希值的最快方法

c - System V 共享内存权限位 : meaning, 以及如何更改

vim - YouCompleteMe 在与 python-mode 一起使用时卡住