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

Chinaunix

標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做? [打印本頁(yè)]

作者: hfzheng    時(shí)間: 2003-01-16 21:16
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
假設(shè)我有如下文件:
cat aa
123   def1      456
345   def2      812
123   def3      563
322   def4      684
123   def5      879
......................
現(xiàn)在我想把第一列中字段相同的合并,第一列不相同的則保留,合并的原則就是保留第一個(gè)出現(xiàn)的前兩個(gè)字段,第三個(gè)字段則把結(jié)果相加,以上面的示例為例:

就是對(duì)于123開(kāi)頭的需要合并,合并后應(yīng)該成為如下:
cat aa
123  def1   1898
345  def2   812
322  def4   684
請(qǐng)問(wèn)用shell如何實(shí)現(xiàn)?
希望各位幫助!,謝謝。
作者: 紅袖添香    時(shí)間: 2003-01-16 22:41
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
...


  1. awk ''{
  2.      if ( length(def[$1]) == 0 ) def[$1]=$2 ;
  3.      sum[$1]+=$3 ;
  4. }
  5. END {
  6.     for (i in def)  {
  7.        print i, def[i] , sum[i]
  8.     }
  9. }'' aa
復(fù)制代碼

作者: hfzheng    時(shí)間: 2003-01-16 22:51
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
謝謝,紅袖添香。我試試看。
作者: hfzheng    時(shí)間: 2003-01-17 14:57
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
測(cè)試結(jié)果發(fā)現(xiàn)會(huì)改變?cè)瓉?lái)的順序。
怎樣才能不改變順序呢?
其中的:
length(def[$1])==0)什么意思阿?謝謝!
作者: hfzheng    時(shí)間: 2003-01-17 15:09
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
另外我的aa文件里面的第二列def*不一定是有規(guī)律的,比如說(shuō)可能是fdas yuri 等等,謝謝!
作者: nkliyong    時(shí)間: 2003-01-17 16:55
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
[quote]原帖由 "hfzheng"]什么意思阿?謝謝![/quote 發(fā)表:

如果def[$1]是空值(即def[$1]還沒(méi)有值是讓他=$2
作者: 紅袖添香    時(shí)間: 2003-01-17 17:14
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
原帖由 "hfzheng" 發(fā)表:

測(cè)試結(jié)果發(fā)現(xiàn)會(huì)改變?cè)瓉?lái)的順序。
怎樣才能不改變順序呢?


昨天的代碼沒(méi)有考慮這個(gè)而且不是最佳的,這個(gè)好點(diǎn)


  1. awk ''{
  2.      if ( length(def[$1]) == 0 ) def[$1]=$2  
  3.      sum[$1]+=$3  
  4.      if ( $1 in ind ) next
  5.      ind[$1]
  6.      print
  7. }'' aa
復(fù)制代碼

另外我的aa文件里面的第二列def*不一定是有規(guī)律的,比如說(shuō)可能是fdas yuri 等等,謝謝!


這個(gè)沒(méi)有關(guān)系,不一定要有規(guī)律。def[$1] 完全可以取其它名字,只是為了和你的源文件配套好理解一點(diǎn)而已。

[quote]原帖由 "nkliyong"]如果def[$1]是空值(即def[$1]還沒(méi)有值是讓他=$2[/quote 發(fā)表:


多謝 nkliyong 代勞,呵呵。
作者: hfzheng    時(shí)間: 2003-01-17 21:53
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
測(cè)試了新代碼:
    已經(jīng)不會(huì)改變行順序,不過(guò)我好像發(fā)覺(jué)現(xiàn)在第三行不加了(新代碼)。還是保留原來(lái)的值,我再試試是不是我的寫(xiě)法有問(wèn)題,謝謝兩位!
作者: 紅袖添香    時(shí)間: 2003-01-17 22:04
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
...

不用試了,是我搞錯(cuò)了。忘記這碴了,:P  sum 根本沒(méi)用上。

那我還得想一下。
作者: 紅袖添香    時(shí)間: 2003-01-17 22:20
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
...



基本上是這樣的:

這樣的關(guān)聯(lián)數(shù)組求和問(wèn)題,到最后的順序是會(huì)改變的。因?yàn)?awk 為了能夠代碼執(zhí)行效率,數(shù)組會(huì)以哈希表的形式放在內(nèi)存中,于是象 sum 這樣的數(shù)組中的鍵 i 不會(huì)按照你給的原來(lái)的順序。

可能得另外再做個(gè)函數(shù)來(lái)保留原來(lái)的順序,或是重排。
作者: hfzheng    時(shí)間: 2003-01-17 23:11
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
我還是想怎么使用了awk之后行順序會(huì)改變呢,原來(lái)是這么回事。太感謝紅袖添香了。
作者: 紅袖添香    時(shí)間: 2003-01-18 00:45
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
...


行了,這樣子就可以了。既求了和,也按原文件順序排列(i hope so...)


  1. awk ''
  2.    BEGIN {n=0}
  3.    {
  4.        if ( length(def[$1]) == 0 ) def[$1]=$2
  5.        sum[$1]+=$3
  6.        if ( $1 in ind ) next
  7.        ind[$1]
  8.        key[n] = $1
  9.        n++
  10.    } END {
  11.        for ( i=0; i<n; i++ )
  12.        print key[i], def[key[i]], sum[key[i]]
  13. }'' aa
復(fù)制代碼

作者: laoxia    時(shí)間: 2003-01-18 02:35
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
哎,大師兄,俺在SOALRIS7, KSH運(yùn)行總是報(bào)錯(cuò)

awk: syntax error near line 6
awk: illegal statement near line 6

是SHELL不同的原因嗎?
作者: 紅袖添香    時(shí)間: 2003-01-18 02:54
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
...


呵呵,Solaris 下,你得用 nawk 就行了。
作者: laoxia    時(shí)間: 2003-01-18 03:01
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
真神啊!
作者: GM    時(shí)間: 2003-01-18 09:21
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
想不到紅袖兄對(duì)awk有這樣的造詣,佩服佩服真佩服,學(xué)習(xí)學(xué)習(xí)再學(xué)習(xí),努力努力要努力!!!!
作者: hfzheng    時(shí)間: 2003-01-18 19:31
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
我也要向各位大俠學(xué)習(xí),真是太厲害了。佩服佩服
作者: 紅袖添香    時(shí)間: 2003-01-19 02:04
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
[quote]原帖由 "GM"]想不到紅袖兄對(duì)awk有這樣的造詣,佩服佩服真佩服,學(xué)習(xí)學(xué)習(xí)再學(xué)習(xí),努力努力要努力!!!![/quote 發(fā)表:



hehe,where, where...
作者: hfzheng    時(shí)間: 2003-01-20 10:15
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
if ( $1 in ind ) next
       ind[$1]
       key[n] = $1
       n++
能不能幫忙解釋這段代碼的意思? ind代表什么?是不是index?
作者: 紅袖添香    時(shí)間: 2003-01-20 19:58
標(biāo)題: 搜索文件中相同字段行,并進(jìn)行處理,如何做?
...

我想這個(gè)應(yīng)該很好理解吧~

ind 表示 index, 因?yàn)?index 是 awk 的保留字,所以就用了這個(gè)名字。

if ( $1 in ind ) next  表示 如果發(fā)現(xiàn) ind 這個(gè)數(shù)組中已經(jīng)有 $1 了,就跳過(guò),取下一個(gè)記錄。所以比如當(dāng)?shù)谝粰诘?次,第3次出現(xiàn)123時(shí),就不會(huì)歸到 ind 這個(gè)數(shù)組中去了。

不重復(fù)的$1將會(huì)保存在key[n]中。




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