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

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

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

$ 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

我想默默地x,y,z从 的输出中获取带有索引的列以及从输出中command_1获取带有索引的列并打印新的输出:。a,b,ccommand_2x,y,z,a,b,c

例子:

输出列列12来自commmand_2: 以及最后一列来自command_1:

$ new_command

7049857 0  hsi
5409858 0  hsi
540958  2  hsi

到目前为止我所拥有的:

我对 比较陌生awk,但我知道我可以使用以下命令从每个命令中获取相应的列awk

command_1 | awk '{print $x " " $y " " $z}'
command_2 | awk '{print $a " " $b " " $c}'

上面垂直连接列,但我需要水平连接它们。

仅打印与第一列相交的那些行:

假设 的行数可能command_2多于或少于command_1。但是,两个命令的第一列都包含属于同一类别的项目 (多位 ID,如上例所示)

这样,假设两个命令的第一列被同等排序,并且新的或丢失的条目只能发生在最后,我们如何确保只打印那些在command_1和中有条目的行command_2(即两个命令)? (上面的例子说明了这一点)

答案1

尝试这样的事情:

join <(command1) <(command2) | cut -d ' ' -f 1,5,4

join命令接受文件,而不是命令,但使用 bash 等 shell,您可以使用所示的结构将命令输出转换为虚拟文件。

如果你喜欢的话,cut你也可以使用。awk

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

答案2

如果你想要 awk,这里有一个:

awk '
  NR==FNR {cmd1[$1] = $NF; next}
  $1 in cmd1 {print $1, $2, cmd1[$1]}
' <(command_1) <(command_2)

awkFNR变量是当前文件中的行号。
NR变量是迄今为止看到的所有行的行号。
因此,条件NR==FNR仅对于第一个文件参数为真。

相关内容