如何使用UNIX命令格式化文本?

时间:2017-10-05 20:54:36

标签: unix awk sed

我正在尝试以特定方式显示目录中具有相同内容的所有文件。如果文件是唯一的,则不需要显示。任何与其他文件相同的文件都需要显示在以逗号分隔的同一行上。

例如,

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,但我不确定。有什么建议?

4 个答案:

答案 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

收集文件的所有行并使用模式匹配来折叠行。在文件的末尾,删除键和任何唯一的行,然后打印剩余部分。