分隔出现文件的短语--Unix Shell

时间:2013-08-26 10:19:16

标签: bash shell unix sed awk

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

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

我想从这个文件中提取最后一组。但问题是,这些组的行数不同,即有些只有一行,有些只有十行。我现在怀疑了吗?

6 个答案:

答案 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