2014-12-04 32 views
1

我有一個像這樣與行的文件塊:保持第一線的相關線路

r1 300 #keep this one 
r1 200 
r1 100 
r1 100 
r2 100 # " 
r2 200 
r3 200 # " 
r3 100 
r3 300 

我只需要保持各個「塊」的第一行(R1,R2,R3等)

期望的輸出:

r1 300 
r2 100 
r3 200 

任何建議?

+0

難道你不能'awk'!a [$ 1] ++''? – 2014-12-04 15:27:23

回答

2
with open('path/to/input') as infile: 
    curr = None 
    for line in infile: 
     if line == curr: 
      continue 
     print(line) 
     curr = line 

或者使用bash:

cat path/to/file | uniq 

或用itertools:

import itertools 

with open('path/to/file') as infile: 
    for line,_stuff in itertools.groupby(infile): 
     print(line) 
+1

不錯的python解決方案,雖然也是對'cat'的無用使用,但使用'uniq'的解決方案不起作用(每行都被打印)。 – 2014-12-04 15:35:26

+0

事實上,我不明白第一個Python是如何檢測行上第一個單詞的任何變化的?它看起來像比較整條線。 – 2014-12-04 15:39:24

6

你可以保持到第一列,僅印刷軌道的變化時,它是不同的:

awk '$1 != last; {last = $1}' file 

分號前的部分h作爲一個隱含的{print}操作,所以如果第一列不等於last的值(已編輯,謝謝),將打印該行。分號後的程序塊無條件運行,並將第一列的值賦予變量last

就更安全是分開處理的第一行(因爲我原本做),並添加一個額外的條件:

awk '!last || $1 != last; {last = $1}' file 

該處理的情況時,在第一行的第一列包含數字0,在它被分配一個值之前將被評估爲等於last

,如果從不重複第一列的內容,你可以使腳本更簡單,因爲在評論中指出(謝謝):

awk '!seen[$1]++' file 

僅打印線,其第一列還沒有被看到,因爲seen[$1]評估爲假。 ++意味着在後續具有相同值$1的行上,seen[$1]已遞增,因此計算結果爲true。

+2

可以更簡單:'awk'![$ 1] ++'' – 2014-12-04 15:27:28

+1

你不需要'!last ||'如果'last'不存在,它不會匹配'$ 1'.Could just是'awk'$ 1!= x && x = $ 1'' – 2014-12-04 15:47:27

+0

對於我以前的評論,例外情況是如果$ 1爲0,這看起來不像OP數據中的可能性 – 2014-12-04 15:53:41