我有时间序列数据,我想在其中找到所有相互匹配的行,但值可能不同(匹配到第一个选项卡)!您可以在下面看到 vimdiff,我想在其中摆脱仅出现在其他时间序列上的日子。
我正在寻找最简单的 unix 工具来完成这项工作!
简单示例
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/