-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 :- 異なるファイルのパス

予想される出力は次のとおり です。このファイルから最後のセットを抽出したいです。しかし問題は、これらのセットの行数がさまざまであることです。つまり、1 行しかないものもあれば、最大 10 行あるものもあります。私の疑いは今明確ですか?
comp1 : path11
comp2 : path12

4

6 に答える 6

2

そのためにソートを使用できます:

$ sort -u file
comp1 
comp2 
comp3 
comp4 

-uフラグは、一意の行のみを保持するようにソートに指示します

または、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
$ awk '/^comp1 /{set=""} {set=set $0 ORS} END{printf "%s",set}' file
comp1 : path11
comp2 : path12
于 2013-08-26T16:22:04.193 に答える
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 に答える
0

できることの 1 つは、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

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 に答える