2016-03-04 301 views
0

上下文:我在給出結果文件的程序上運行計算。 在這些結果文件(擴展名.h5),我可以申請一個Python代碼(我不能改變這個Python代碼),使得它給了我一個方陣:用python替代bash(awk命令)

oneptdm.py resultfile.h5 

給我,例如:

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 
points groups 
1 
2 
3 
... 

在一個名爲oneptdm.dat的文件中

我想grep這個矩陣的對角線。通常我只使用bash:

awk '{ for (i=0; i<=NF; i++) if (NR >= 1 && NR == i) print i,$(i) }' oneptdm.dat > diagonal.dat 

但是對於x原因,我必須現在就用python來做。我怎樣才能做到這一點 ? 我當然可以使用「subprocess」來再次使用awk,但是我想知道是否有另一種方法可以用2.6版本的python腳本來實現。 結果應該是:

(line) (diagonal element) 
1  1 
2  6 
3  11 
4  16 
+3

請注意,您稍微有一些混亂找awk腳本可以寫成'的awk '{打印NR,$ NR}' file' –

+0

這是一個awk腳本,不是Bash腳本(儘管當然重定向必須由shell來處理)。 – tripleee

+0

@tripleee當然,你是對的,但不要忘記'awk'可以獨立完成它。像'awk'{print「foo」> bar}'' – hek2mgl

回答

1

這應該做的伎倆。它確實假設文件以方矩陣開始,並且該假設用於限制從文件中讀取的行數。

with open('oneptdm.dat') as f: 
    line = next(f).split() 
    for i in range(len(line)): 
     print('{0}\t{1}'.format(i+1, line[i])) 
     try: 
      line = next(f).split() 
     except StopIteration: 
      break 

輸出作爲樣本文件:

 
1 1 
2 6 
3 11 
4 16 
+0

當使用你的代碼時,我有一個錯誤「print('{} \ t {}'.format(i + 1,line [i]))ValueError:零長度字段名。我在我使用的機器上實現了python 2.6.6,我不知道它是否是原因。 –

+0

@B_runo:好的,格式字符串固定爲Python 2.6。 – mhawke

2

你可以嘗試這樣的事情:

with open('oneptdm.dat') as f: 
    for i, l in enumerate(f): 
     print '%d\t%s' % (i + 1, l.split()[i]) 
+2

我會使用'enumerate'而不是手動更新循環中的'i'。 – Blckknght

+0

感謝您的反饋! –

+1

@AlexeiShestakov:不幸的是,您的其他正確答案已被輸入文件格式的更新無效。更好地解決它之前,它吸引downvotes。 – mhawke