Shell 每隔一行比较一次,然后打印一行,但删除重复项

Shell 每隔一行比较一次,然后打印一行,但删除重复项,shell,sed,terminal,awk,grep,Shell,Sed,Terminal,Awk,Grep,我有一个以下格式的文件: id-of-item description of item id-of-item description of item id-of-item description of item id-of-item description of item id-of-item description of item (每行之间只有一行,此处只有较大的空格) 我需要比较项目的描述,如果它们匹配,则删除该描述,但保留id(我需要制作一个将id作为组引用的表) 我

我有一个以下格式的文件:

id-of-item

description of item

id-of-item

description of item

id-of-item

description of item

id-of-item

description of item

id-of-item

description of item
(每行之间只有一行,此处只有较大的空格)

我需要比较项目的描述,如果它们匹配,则删除该描述,但保留id(我需要制作一个将id作为组引用的表)


我不知道如何做到这一点,我已经尝试了两个awk与NR%2和uniq等,但显然都只匹配了一个,而不是另一个=/

这可能很接近。awk的规则是, 将要消除重复的内容放入数组的索引中:

BEGIN {title = ""}
NF == 0 { print; next;}
title == "" {
    title = $0;
    print; next;
}
{
    if (value[$0] == "" ) print;
    value[$0] = $0;
    title = ""
}
感受关联数组的力量。

这可能会帮助您(?)

如果要删除描述,请执行以下操作:

# sed 'N;s/\n/!!!/' input.txt | sort -u | sed 's/!!!.*//'
id-of-item0
id-of-item1
id-of-item3
id-of-item4
说明:

一次读取
input.txt
2行,用分隔符替换换行符
\n
(这里是
!!!
)。排序并删除重复项。替换分隔符
通过换行符
\n
。或者完全删除描述

编辑:

这可能适合您(?):


我将做两个简化的假设:

  • 描述只有一行
  • 您可以识别描述或ID中未出现的字符。我将使用此角色的选项卡
  • 这两种假设都不是很强,因此,如果需要的话,调整以下假设应该不难

    根据这些假设,我将使用
    printf“1\n\nitem 1\n\n2\n\nitem 2\n\n3\n\nitem 2\n\n4\n\nitem 1\n”
    生成示例数据。看起来是这样的:

    1
    
    item 1
    
    2
    
    item 2
    
    3
    
    item 2
    
    4
    
    item 1
    
    要处理此数据,我将:

    摆脱空白行
  • 连接连续的行,用制表符分隔ID和描述
  • 按描述字段对新行排序
  • 将已排序的行格式化为表格
  • 这里有一条管道可以做到这一点:

    grep -v '^[[:space:]]*$' |        
      awk 'NR%2 { printf("%s\t", $0) } !(NR%2)' | 
        sort -k2 | 
          awk -F"\t" 'desc != $2 { printf("-----\n%s\n", $2); desc = $2} { print $1 }'
    
    通过管道将样本数据传递给它,您将获得

    -----
    item 1
    1
    4
    -----
    item 2
    2
    3
    
    这样行吗

    awk 'NF' file | sed '{N;s/\n/:/g}' | 
    awk -F":" -v OFS="\n\n" -v ORS="\n\n"  '{b[$2]++} {if (b[$2]>1) print $1; else print $1,$2}'
    
    您的文件:

    [jaypal:~/Temp] cat file
    id-of-item31
    
    description of item4 <--- Duplicate description
    
    id-of-item22
    
    description of item4 <--- Duplicate description
    
    id-of-item34
    
    description of item1 <--- Duplicate description
    
    id-of-item21
    
    description of item3
    
    id-of-item11
    
    description of item1 <--- Duplicate description
    
    [jaypal:~/Temp] awk 'NF' file | sed '{N;s/\n/:/g}' | 
    awk -F":" -v OFS="\n\n" -v ORS="\n\n"  '{b[$2]++} {if (b[$2]>1) print $1; else print $1,$2}'
    
    id-of-item31
    
    description of item4
    
    id-of-item22
    
    id-of-item34
    
    description of item1
    
    id-of-item21
    
    description of item3
    
    id-of-item11
    

    你能把实际的输入格式,而不是下面的描述,包括预期的输出吗?我不太明白“每一行之间只有一行”。空行是记录分隔符,描述可能跨越多行?空行没有意义,奇数行有ID,偶数行有单行描述?如果我错了,我错了!但是,那些更聪明的人的一句评论可能会把我推向正确的方向;下一个我不知道你能那样做=]哦,我的错!我已将主文件转换为临时文件,用于测试。我会更新上面的答案。
    [jaypal:~/Temp] cat file
    id-of-item31
    
    description of item4 <--- Duplicate description
    
    id-of-item22
    
    description of item4 <--- Duplicate description
    
    id-of-item34
    
    description of item1 <--- Duplicate description
    
    id-of-item21
    
    description of item3
    
    id-of-item11
    
    description of item1 <--- Duplicate description
    
    [jaypal:~/Temp] awk 'NF' file | sed '{N;s/\n/:/g}' | 
    awk -F":" -v OFS="\n\n" -v ORS="\n\n"  '{b[$2]++} {if (b[$2]>1) print $1; else print $1,$2}'
    
    id-of-item31
    
    description of item4
    
    id-of-item22
    
    id-of-item34
    
    description of item1
    
    id-of-item21
    
    description of item3
    
    id-of-item11