假设我有两个不同的命令按列输出内容,例如:
$ 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,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
到目前为止我所拥有的:
我对 比较陌生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
仅对于第一个文件参数为真。