我有一个带有某些文件路径标记的文件。它们出现在集合中,如下所示: -
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
我想从这个文件中提取最后一组。但问题是,这些组的行数不同,即有些只有一行,有些只有十行。我现在怀疑了吗?
答案 0 :(得分:2)
您可以使用sort:
$ 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
答案 1 :(得分: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
答案 2 :(得分: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
>
答案 3 :(得分: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
答案 4 :(得分:1)
$ awk '/^comp1 /{set=""} {set=set $0 ORS} END{printf "%s",set}' file
comp1 : path11
comp2 : path12
答案 5 :(得分:0)
可以做的一件事是知道set始终以comp1开始,我们可以从末尾遍历直到第一个“comp1”发生。一旦从末尾知道“comp1”的索引,我们就可以打印出行或最后的“设置”。
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
数组收集comp条目,b数组收集路径条目,-F':'awk命令中使用的选项根据':'分隔符分隔两个条目。
或更简单的方式,
awk '$1~/comp1/{cnt=NR}{array[count++]=$0}END{for(i=cnt-1;i<=NR;i++)print array[i]}'
inputfile