假设我有两个不同的命令按列输出内容,例如:
$ command_1
7049857 abc fdg hsi
5409858 xxx fyy hsi
540958 abc zzz hsi
54230956 rbc sss hsi
$ command_2
7049857 0 fdg free
5409858 0 fyy free
540958 2 zzz free
Run Code Online (Sandbox Code Playgroud)
我想静静地抢列与指数x,y,z从输出command_1和列与指数a,b,c从输出command_2和打印新的输出:x,y,z,a,b,c。
从:输出第1列和第2列,从commmand_2:输出最后一列command_1:
$ new_command
7049857 0 hsi
5409858 0 hsi
540958 2 hsi
Run Code Online (Sandbox Code Playgroud)
我对 比较陌生awk,但我知道我可以使用以下命令从每个命令中获取相应的列awk:
command_1 | awk '{print $x " " $y " " $z}'
command_2 | awk '{print $a " " $b " " $c}'
Run Code Online (Sandbox Code Playgroud)
上面垂直连接列,但我需要水平连接它们。
假设command_2行数可能多于或少于command_1。但是,这两个命令的第一列包含属于同一类别的项目 (多位 ID,如上例所示)
有了这个,假设两个命令的第一列排序相同,并且新的或丢失的条目只能发生在最后,我们如何确保我们只打印我们在command_1and 中有条目的那些行command_2(即两个命令)?(上面的例子显示了这一点)
尝试这样的事情:
join <(command1) <(command2) | cut -d ' ' -f 1,5,4
Run Code Online (Sandbox Code Playgroud)
该join命令接受文件,而不是命令,但使用诸如 bash 之类的 shell,您可以使用显示的构造将命令输出转换为虚拟文件。
如果cut您愿意,也可以使用代替awk您。
如果您发现自己经常这样做,请考虑使用关系数据库引擎。