我正在比较两个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软件包已更改版本但仍具有相同的软件包名称。
答案 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