-2

我有一个带有一些文件路径标签的文件。它们出现在集合中,如下所示:-

comp1 : path1
comp2 : path2
comp3 : path3
comp1 : path4
comp1 : path5
comp2 : path6
comp1 : path7
comp2 : path8
comp3 : path9
comp4 : path10
comp1 : path11
comp2 : path12

在哪里

  • compN:- 是标签
  • pathN :- 不同文件的路径

预期的输出是: 我想从这个文件中提取最后一组。但问题是,这些集合的行数各不相同,即,有些只有一行,有些则多达十行。我的疑问现在清楚了吗?
comp1 : path11
comp2 : path12

4

6 回答 6

2

您可以为此使用排序:

$ sort -u file
comp1 
comp2 
comp3 
comp4 

-u标志告诉 sort 只保留唯一的行

或者如果你必须使用 awk,你可以这样做

awk '!a[$0]++' file

回答更新的问题

使用这个 awk 命令:

$ awk '{a[$1]=$0}END{for (i in a) print a[i]}' file
comp1 : path11
comp2 : path12
comp3 : path9
comp4 : path10
于 2013-08-26T10:22:44.507 回答
1
>cat comp.txt
comp1
comp2
comp3
comp4
comp1
comp2
comp3
comp1
comp2
comp1
comp2
comp3
comp4
>sort comp.txt | uniq
comp1
comp2
comp3
comp4
于 2013-08-26T10:29:38.053 回答
1
perl -lne '$count++;push @a,$_;$i=$count if(/comp1/);END{print join "\n",@a[($i-1)..(scalar(@a)-1)]}' your_file

测试如下:

> cat temp
comp1
comp2
comp3
comp4
comp1
comp2
comp3
comp1
comp2
comp1
comp2
comp3
comp4
> perl -lne '$count++;push @a,$_;$i=$count if(/comp1/);END{print join "\n",@a[($i-1)..(scalar(@a)-1)]}' temp
comp1
comp2
comp3
comp4
>
于 2013-08-26T10:29:53.657 回答
1

我相信 Python 解决方案比 Perl 更具可读性

for line in sorted(set(open('comp.txt').readlines())):
  print line.strip()

你会像这样运行它

echo -e "for line in sorted(set(open('comp.txt').readlines())):\n  print line.strip()" | python
comp1
comp2
comp3
comp4
于 2013-08-26T10:45:43.780 回答
1
$ awk '/^comp1 /{set=""} {set=set $0 ORS} END{printf "%s",set}' file
comp1 : path11
comp2 : path12
于 2013-08-26T16:22:04.193 回答
0

可以做的一件事是知道 set 总是以 comp1 开头,我们可以从末尾遍历直到第一个“comp1”出现。一旦从末尾知道“comp1”的索引,我们就可以打印出行或最后的“set”。

awk -F':' 'BEGIN{cnt = 0} {a[cnt1++] = $1; b[cnt2++] = $2;} 
END{for(i = NR; i >= 0; i--){if(a[0] == a[i]){cnt++;
if(cnt == 1){k= i;}}} for(j=k;j<NR;j++)print a[j],":",b[j];}' inputfile

a 数组收集 comp 条目,b 数组收集路径条目,awk 命令中使用的 -F':' 选项基于 ':' 分隔符分隔两个条目。

或者更简单的方法

awk '$1~/comp1/{cnt=NR}{array[count++]=$0}END{for(i=cnt-1;i<=NR;i++)print array[i]}'  
inputfile
于 2013-08-26T11:34:51.773 回答