我有一個像這樣與行的文件塊:保持第一線的相關線路
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
任何建議?
我有一個像這樣與行的文件塊:保持第一線的相關線路
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
任何建議?
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)
不錯的python解決方案,雖然也是對'cat'的無用使用,但使用'uniq'的解決方案不起作用(每行都被打印)。 – 2014-12-04 15:35:26
事實上,我不明白第一個Python是如何檢測行上第一個單詞的任何變化的?它看起來像比較整條線。 – 2014-12-04 15:39:24
你可以保持到第一列,僅印刷軌道的變化時,它是不同的:
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。
可以更簡單:'awk'![$ 1] ++'' – 2014-12-04 15:27:28
你不需要'!last ||'如果'last'不存在,它不會匹配'$ 1'.Could just是'awk'$ 1!= x && x = $ 1'' – 2014-12-04 15:47:27
對於我以前的評論,例外情況是如果$ 1爲0,這看起來不像OP數據中的可能性 – 2014-12-04 15:53:41
難道你不能'awk'!a [$ 1] ++''? – 2014-12-04 15:27:23