2011-10-29 14 views
3

我是新來的awk編程和有關使用NR變量的有點糊塗..文件格式:使用混亂AWK NR可變

我的代碼...

awk 'BEGIN {k=NR;}{printf("%s %s %s %s\n",$k,$(k+1),$(k+2),$(k+3))}' auth_data 

$貓AUTH_DATA

6262 6530 6661 3162 6364 6264 6561 3430 3033 3332 6536 3139 6230 6261 61 
30 3637 0A00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 

輸出:

6262 6530 6661 3162 6364 6264 6561 3430 3033 3332 6536 3139 6230 6261 6130 
3637 0A00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 
0000 0000 6262 6530 6661 

但我想的是,輸出應該在這個格式:

6262 6530 6661 3162 6364 6264 6561 3430 
    3033 3332 6536 3139 6230 6261 6130 3637 
    0A00 0000 0000 0000 0000 0000 0000 0000 
    0000 0000 0000 0000 0000 0000 0000 0000 
+0

了投票以及格式化和邏輯問題。保持良好的工作,祝你好運! – shellter

+0

@shelter多謝先生..我會在將來盡力而爲 –

回答

3

我猜你正在尋找的是NF,不是NR。

從聯機幫助:

NR的迄今所看到的輸入記錄的總數。

NR是實際的行號,但在這個問題中,你想對字段idx做一些技巧,而不是行。

此外,我認爲你的輸入數據應該在文件'auth_data'的一行中,對吧?

如果是這樣,你可以嘗試

awk '{for(i=1;i<=NF;i++)if(i%8==0)print $i;else printf $i" "}' auth_data 

檢查下面的測試:

kent$ echo "6262 6530 6661 3162 6364 6264 6561 3430 3033 3332 6536 3139 6230 6261 6130 3637 0A00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000"|\ 
awk '{for(i=1;i<=NF;i++)if(i%8==0)print $i;else printf $i" "}' 
    6262 6530 6661 3162 6364 6264 6561 3430 
    3033 3332 6536 3139 6230 6261 6130 3637 
    0A00 0000 0000 0000 0000 0000 0000 0000 
    0000 0000 0000 0000 0000 0000 0000 0000 

而回到這個問題,如果你只是想要做的格式,xargs的是足夠的。見下圖:

kent$ echo "6262 6530 6661 3162 6364 6264 6561 3430 3033\ 
     3332 6536 3139 6230 6261\ 
     6130 3637 0A00 0000 0000 \ 
     0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000"|xargs -n8 

輸出:

6262 6530 6661 3162 6364 6264 6561 3430 
3033 3332 6536 3139 6230 6261 6130 3637 
0A00 0000 0000 0000 0000 0000 0000 0000 
0000 0000 0000 0000 0000 0000 0000 0000 

可以cat yourFile|xargs -n8xargs -n8 -a yourfile

+0

Thanx甚至沒有聽說過'xargs' ......整個問題只在一行中解決,我需要它在我的代碼中至少有10次' 。再次感謝! –