我正在尝试以特定方式显示目录中具有相同内容的所有文件。如果文件是唯一的,则不需要显示。任何与其他文件相同的文件都需要显示在以逗号分隔的同一行上。
例如,
c176ada8afd5e7c6810816e9dd786c36 2group1
c176ada8afd5e7c6810816e9dd786c36 2group2
e5e6648a85171a4af39bbf878926bef3 4group1
e5e6648a85171a4af39bbf878926bef3 4group2
e5e6648a85171a4af39bbf878926bef3 4group3
e5e6648a85171a4af39bbf878926bef3 4group4
2d43383ddb23f30f955083a429a99452 unique
3925e798b16f51a6e37b714af0d09ceb unique2
应显示为,
2group1, 2group2
4group1, 4group2, 4group3, 4group4
我知道哪些文件在使用md5sum的目录中被认为是唯一的,但我不知道如何进行格式化部分。我认为解决方案涉及awk或sed,但我不确定。有什么建议?
答案 0 :(得分:2)
Awk 解决方案(针对您当前的输入):
#pragma once
#include"LTexture.hpp"
bool LTexture::loadFromFile(std::string path, SDL_Renderer* _gameRenderer)
{
//Get rid of preexisting texture
free();
//The final texture
SDL_Texture* _newTexture = NULL;
//Load image at specified path
SDL_Surface* _loadedSurface = IMG_Load(path.c_str());
if (_loadedSurface == NULL)
{
printf("Unable to load image %s! SDL_image Error: %s\n", path.c_str(), IMG_GetError());
}
else
{
//Color key image
SDL_SetColorKey(_loadedSurface, SDL_TRUE, SDL_MapRGB(_loadedSurface->format, 0, 0xFF, 0xFF));
//Create texture from surface pixels
_newTexture = SDL_CreateTextureFromSurface(_gameRenderer, _loadedSurface);
if (_newTexture == NULL)
{
printf("Unable to create texture from %s! SDL Error: %s\n", path.c_str(), SDL_GetError());
}
else
{
//Get image dimensions
_width = _loadedSurface->w;
_height = _loadedSurface->h;
}
//Get rid of old loaded surface
SDL_FreeSurface(_loadedSurface);
}
//Return success
_texture = _newTexture;
return _texture != NULL;
}
- 为第一个字段值
.htaccess
显示的每个唯一哈希累积组名称(来自字段.htaccess
)。数组awk '{ a[$1]=a[$1]? a[$1]", "$2:$2 }END{ for(i in a) if(a[i]~/,/) print a[i] }' file
由哈希索引,并带有连接的组名称作为值(以逗号a[$1]=a[$1]? a[$1]", "$2:$2
分隔)。
$2
- 迭代数组项目
$1
- 表示:如果哈希与多个组相关联(以逗号a
分隔) - 打印项目
输出:
,
答案 1 :(得分:0)
根据您提供的输入,您基本上希望收集第一列相同的所有第二列。所以第一步是使用awk来第一列哈希第二列。我利用此处发布的解决方案:Concatenate lines by first column by awk or sed
awk '{table[$1]=table[$1] $2 ",";} END {for (key in table) print key " => " table[key];}' file
c176ada8afd5e7c6810816e9dd786c36 => 2group1,2group2,
e5e6648a85171a4af39bbf878926bef3 => 4group1,4group2,4group3,4group4,
3925e798b16f51a6e37b714af0d09ceb => unique2,
2d43383ddb23f30f955083a429a99452 => unique,
如果您真的想要过滤以排除唯一的字段,请确保您至少有两个字段(告诉AWK使用','作为分隔符):
awk '{table[$1]=table[$1] $2 ",";} END {for (key in table) print key " => " table[key];}' file | awk -F ',' 'NF > 2'
c176ada8afd5e7c6810816e9dd786c36 => 2group1,2group2,
e5e6648a85171a4af39bbf878926bef3 => 4group1,4group2,4group3,4group4,
答案 2 :(得分:0)
perl的:
post
输出的顺序是不确定的。
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed -r 'H;x;s/((\S+)\s+\S+)((\n[^\n]+)*)\n\2\s+(\S+)/\1,\5\3/;x;$!d;x;s/.//;s/^\S+\s*//Mg;s/\n[^,]+$//Mg;s/,/, /g' file
收集文件的所有行并使用模式匹配来折叠行。在文件的末尾,删除键和任何唯一的行,然后打印剩余部分。