2011-12-02 82 views
-1

我有格式文件:比较后,每第二条线,打印线,但删除重复

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为组)

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

+1

可以包括实际的输入格式,而不是下面的描述,包括预期的输出? –

+2

我不太明白“每条线之间只有一条线”。空白行是记录分隔符,描述可能跨越多行?空白行是无意义的,奇数行有ID,甚至行有单行描述? –

回答

2

这可能很接近。 AWK的规则是,无论你想杀死复制到数组的索引 地说:

BEGIN {title = ""} 
NF == 0 { print; next;} 
title == "" { 
    title = $0; 
    print; next; 
} 
{ 
    if (value[$0] == "") print; 
    value[$0] = $0; 
    title = "" 
} 

觉得关联数组的力量。

+0

,实际上看起来非常完美,谢谢你这么多=] 我印象非常深刻;接下来;我不知道你可以这样做=] –

0

这可以帮助你(?):

# cat input.txt 
id-of-item0 
id-of-item0 description of item0 
id-of-item1 
id-of-item1 description of item1 
id-of-item0 
id-of-item0 description of item0 
id-of-item3 
id-of-item3 description of item3 
id-of-item4 
id-of-item4 description of item4 
# sed 'N;s/\n/!!!/' input.txt | sort -u | sed 's/!!!/\n/' 
id-of-item0 
id-of-item0 description of item0 
id-of-item1 
id-of-item1 description of item1 
id-of-item3 
id-of-item3 description of item3 
id-of-item4 
id-of-item4 description of item4 

如果你想删除的描述:

# 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替换分​​隔符!!!。或完全删除说明。

编辑:

这可能会为你工作(?):

sed '/^$/d' input_file | # remove empty lines 
sed -n 'h;n;G;s/\n/\t/p' | # join id with description and swap tab separating 
sort |      # sort descriptions 
sed ':a;N;s/^\(\([^\t]*\)\t[^\n]*\)\n\2/\1/;ta;P;D' | # build index tab separated 
sed 's/\t/\n/g'   # translate tabs to newlines 
+2

如果我错了,我错了!但是那些聪明的评论可能会促使我朝正确的方向发展。 – potong

+0

我同意,我们不应该在没有任何评论的情况下投票。 –

0

我要提出两个简化的假设:

  1. 描述只是一个线长。
  2. 您可以识别没有出现在说明或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 

为了处理这些数据,我会:

  1. 摆脱空行
  2. 加入连续行,以制表分离的ID和描述
  3. 按描述字段排序新行
  4. 将排序后的行格式化为表格

这里有一个管道,做它:

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 
0

将这项工作?

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 
+0

什么是'file1'? –

+0

哦,我的坏!我已经将主文件转换为用于测试的临时文件。我会更新上面的答案。 –