显示TSV与列之间的差异

时间:2016-10-26 03:50:56

标签: awk sed diff

我正在比较两个TSV文件,它们是像这样生成的包列表:

rpm -qa --qf "%{name}\t%{version}\t%{license}\n" | sort -n > packages

这将生成一个制表符分隔文件,例如:

alsa-firmware   1.0.28  GPL+ and BSD and GPLv2+ and GPLv2 and LGPLv2+
alsa-lib        1.0.28  LGPLv2+
alsa-tools-firmware     1.0.27  GPLv2+

在另一个系统上,我运行相同的命令,其中安装了相当多的软件包。我想在第二台服务器上列出这些附加软件包。这里棘手的部分是我希望匹配列表不按版本过滤。 Comm和Diff检查整行,我只想按第一个"列"过滤。

例如,如果第二台服务器具有以下包列表:

acl     2.2.51  GPLv2+
alsa-firmware   2.0.28  GPL+ and BSD and GPLv2+ and GPLv2 and LGPLv2+
alsa-lib        2.0.29  LGPLv2+
alsa-tools-firmware     2.0.27  GPLv2+
audit   2.4.1   GPLv2+
binutils        2.23.52.0.1     GPLv3+

我正在寻找一个命令(sed,awk,comm,diff等),它将返回第一列的差异 - 在这种情况下将是:

acl     2.2.51  GPLv2+
audit   2.4.1   GPLv2+
binutils        2.23.52.0.1     GPLv3+

请注意,alsa软件包已更改版本但仍具有相同的软件包名称。

1 个答案:

答案 0 :(得分:1)

使用class GraphicComponent { unsigned height; unsigned width; public: sf::Texture texture; sf::Sprite sprite; GraphicComponent() { } GraphicComponent(unsigned init_height, unsigned init_width, std::string texture_path) { width = init_width; height = init_height; texture.loadFromFile(texture_path); sprite.setTexture(texture); } // Give it a copy constructor GraphicComponent(GraphicComponent const& other) : height(other.height) , width(other.width) , texture(other.texture) , sprite(texture) // make it point to the new Texture not the other one { } }; ,仅匹配两个文件中的第一列

awk


或者将第一列作为搜索模式传递​​给$ awk 'NR==FNR{a[$1]; next} !($1 in a)' file1 file2 acl 2.2.51 GPLv2+ audit 2.4.1 GPLv2+ binutils 2.23.52.0.1 GPLv3+ 。这假定grep中的其他列不会与搜索字词

匹配
file2


使用$ awk '{print $1}' file1 | grep -vFf - file2 acl 2.2.51 GPLv2+ audit 2.4.1 GPLv2+ binutils 2.23.52.0.1 GPLv3+ ,类似于sed解决方案,但如果grep的第一列包含任何正则表达式元字符,则容易出错

file1