水平连接列。仅打印与第一列相交的行

Ame*_*ina 3 zsh awk

假设我有两个不同的命令按列输出内容,例如:

$ 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(即两个命令)?(上面的例子显示了这一点)

Pet*_*aut 6

尝试这样的事情:

join <(command1) <(command2) | cut -d ' ' -f 1,5,4
Run Code Online (Sandbox Code Playgroud)

join命令接受文件,而不是命令,但使用诸如 bash 之类的 shell,您可以使用显示的构造将命令输出转换为虚拟文件。

如果cut您愿意,也可以使用代替awk您。

如果您发现自己经常这样做,请考虑使用关系数据库引擎。

  • `join` 需要排序文件,您可以使用 `-o` 选项来选择输出字段:`join &lt;(command_1|sort) &lt;(command_2|sort) -o 2.1,2.2,1.4` (4认同)