亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 關(guān)于文本內(nèi)容合并 [打印本頁]

作者: dahaoshanhe    時(shí)間: 2016-05-08 19:39
標(biāo)題: 關(guān)于文本內(nèi)容合并
按照第二列范圍壓縮顯示

cat file:
111 1
111 2
333 7
222 6
222 9
111 3
222 10
333 3
333 4
333 5
333 6

result:
111 1-3
222 6-6
222 9-10
333 3-7


作者: haooooaaa    時(shí)間: 2016-05-08 21:21
本帖最后由 haooooaaa 于 2016-05-09 21:52 編輯

已更改, 需要 awk 4.0
  1. awk '{a[$1][$2]=$2}END{for(i in a){s=asort(a[i],b);f=e=b[1];for(j=2;j<=s;j++){if(b[j]-1==e)e=b[j];else{print i,f"-"e;f =e=b[j]}}print i,f"-"e}}'
復(fù)制代碼

作者: sunzhiguolu    時(shí)間: 2016-05-08 22:57
回復(fù) 1# dahaoshanhe
你試下,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Join{
  5.     my $sID = shift;
  6.     if (@_ > 1){
  7.         printf ("%s %s\n",$sID,join ("-", @_[0, -1]));
  8.     }else{
  9.         printf ("%s %s\n",$sID, join ("-", $_[0], $_[0]));
  10.     }
  11. }

  12. my @aData;
  13. foreach (`sort -t" " -k1,1n -k2,2n f`){
  14.     my @aList = split;
  15.     if (!@aData){
  16.         @aData = @aList;
  17.         next;
  18.     }
  19.     if ($aData[0] == $aList[0]){
  20.         if ($aData[-1] + 1 == $aList[-1]){
  21.             push (@aData, $aList[-1]);
  22.         }else{
  23.             Join (@aData);
  24.             $#aData = 0;
  25.             push (@aData, $aList[-1]);
  26.         }
  27.         next;
  28.     }
  29.     Join (@aData);
  30.     @aData = @aList;
  31. }
  32. Join (@aData);
復(fù)制代碼
111 1-3
222 6-6
222 9-10
333 3-7

   
作者: sunzhiguolu    時(shí)間: 2016-05-09 00:08
把 Join 函數(shù)精簡(jiǎn)了下:
  1. sub Join{
  2.     printf ("%s %s\n",$_[0], join ("-", @_[1, -1]));
  3. }
復(fù)制代碼

作者: dahaoshanhe    時(shí)間: 2016-05-09 06:56
回復(fù) 2# haooooaaa


    你這是在哪個(gè)版本的AWK上運(yùn)行的,我的版本不識(shí)別這樣的寫法
作者: elu_ligao    時(shí)間: 2016-05-09 09:16
  1. awk '{a[$1]=a[$1] $2 FS}END{for(i in a){l=split(a[i],b);asort(b);printf i FS b[1]"-";for(k=2;k<=l;++k){if(b[k]!=b[k-1]+1)printf b[k-1]"\n"i FS b[k]"-"};printf b[k-1]"\n"}}'
復(fù)制代碼

作者: jcdiy0601    時(shí)間: 2016-05-09 09:39
sort -n -k2,2 file|awk '{a[$1]=a[$1]" "$2}END{for(i in a)print i,a[i]}'|awk '{print $1,$2"-"$NF}'
111 1-3
222 6-10
333 3-7

作者: dahaoshanhe    時(shí)間: 2016-05-09 10:02
回復(fù) 7# jcdiy0601


    我和你的思路一樣,只是SORT傷不起啊,有2億多行記錄,效率不高。
作者: 99超人    時(shí)間: 2016-05-09 10:04
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
作者: jason680    時(shí)間: 2016-05-09 10:36
回復(fù) 5# dahaoshanhe

$ awk 'function xsort(v,s ,t,n,e){split(s,c," ");t=asort(c);e=c[1];printf ("%s %d-",v,e);for(n=2;n<=t;++n){if(c[n]-e-1)printf("%d\n%s %d-",e,v,c[n]);e=c[n]}print e}{a[$1]=a[$1]$2" "}END{t=asorti(a,b);for(n=1;n<=t;++n){xsort(b[n],a[b[n]])}}' file
111 1-3
222 6-6
222 9-10
333 3-7

   
作者: haooooaaa    時(shí)間: 2016-05-09 11:29
本帖最后由 haooooaaa 于 2016-05-09 17:39 編輯

回復(fù) 5# dahaoshanhe


    前面那個(gè)是錯(cuò)的, 用的awk 4.0

下面這個(gè)python 測(cè)試可以,
  1. result = {}

  2. with open("file") as f:
  3.     for i in f:
  4.         try: result.setdefault(i.split()[0],[]).append(int(i.split()[-1]))
  5.         except: pass
  6.             
  7. for i in result:
  8.     li = sorted(result[i])
  9.     start = end = li[0]
  10.     for j in li[1:]:
  11.         if j - 1 == end:
  12.             end = j
  13.         else:
  14.             print "%s %s-%s" % (i,start,end)
  15.             start = end = j
  16.     print "%s %s-%s" % (i,start,end)
復(fù)制代碼
這樣更好一點(diǎn)。
作者: sunzhiguolu    時(shí)間: 2016-05-09 16:33
都是傳說中的戰(zhàn)斗機(jī)啊, 向各位大神致敬!
作者: sunzhiguolu    時(shí)間: 2016-05-09 16:59
回復(fù) 6# elu_ligao
大神能問下, 您這個(gè) ID 咋是紅的,

   
作者: elu_ligao    時(shí)間: 2016-05-09 17:12
回復(fù) 13# sunzhiguolu


    我也不清楚呀, 就是上次認(rèn)證過后就紅了, 我看到有些是紅的, 有些是藍(lán)的, 不知道有什么特殊含義




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2