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