2012-09-29 24 views
0

好吧,我希望這不是一個愚蠢的問題,但我並尋找令人沮喪的硬的答案已經沒有什麼幫助,......我有以下awk表達式,我的工作:我可以在AWK中的區間表達式內的表達式中使用NR嗎?

awk '{str="";a=0;while (a++<15) str=str "0,";{ sub(/^.{6}/,"&" "1,",str) }; print str}' sample.txt 

樣品.txt可以是任何文本文件,在這一點上它並不重要,因爲它只是驅動重複(這是希望達到目的的一種手段)。輸出看起來是這樣的(當然這取決於有多少行是在Sample.txt的文件):

0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 

我真正想要的不過做的是這樣的:

awk '{str="";a=0;while (a++<15) str=str "0,";{ sub(/^.{2*NR-1}/,"&" "1,",str) }; print str}' sample.txt 

哪應該產生這樣的輸出:

1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 
0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 

這可能嗎?我已經嘗試了一切,以獲得Awk拿起2*NR-1但似乎沒有工作,...我做錯了什麼?

特里

+0

有人可以糾正我,如果我錯了,但我從來沒有管理使用可變的時間間隔內表現。另外,要使用區間表達式,您必須設置'awk'的'-r'標誌。請參閱[man](http://www.gnu.org/software/gawk/manual/gawk.html)頁面。 – Steve

+0

其實我的第一個awk語句確實有效,......不知道爲什麼它沒有-r標誌,...無論如何謝謝回覆! :) – Terry

回答

2

的方法你想顯得頗爲繁瑣。你有沒有考慮過使用這樣的awk

awk '{ for (i=1; i<=15; i++) printf (NR == i) ? "1," : "0,"; printf "\n" }' file.txt 
+0

美麗!顯然我有很多東西要學習:) – Terry

1

你也可以去的coreutils,sed和慶典的組合:

s=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
seq 16 | while read; do sed 's/0/1/'$REPLY <<< $s; done 
+0

謝謝!唯一的問題是我有1000個0的字符串,所以我必須用更多的代碼替換第一行:) – Terry

+0

只要它不會變成數十億,就應該這樣做:'s = $(seq 10000 | sed 's /.*/ 0,/'| tr -d'\ n')'。 – Thor

+0

謝謝! :)所有非常酷的解決方案! – Terry

相關問題