2013-07-09 49 views
0

我有一個包含大量列的文件。一列包含數字的列表:使用awk測量同一列中兩個數字之間的差異

asd "/$ 0 
    asd /"$ 1 
    add %$" 4 
    add "/% 18 
    ads "/% 24 
    add "/% 30 

我想編寫用awk,使測量和前一行爲例之前(行包含在列數之間的差異的腳本:之間的區別第三行中的第一行) 那麼輸出將是:

4 
17 
20 
12 

我怎麼能這樣做? (如果您有關於awk的一個很好的教程,我將非常感激)

+0

問題是不完整的,你給無柄你如何到達樣本輸出中的其他值。 – tink

+1

@tink,它看起來對我來說很有意義。 –

+0

你可能也想參考GNU awk手冊。 – devnull

回答

2

下面是用模數運算符,以創建一個數組,所需的計算僅存儲最後元件的一種方法:

$ awk 'NR>2{print $3-a[(NR-2)%3]}{a[NR%3]=$3}' file 
4 
17 
20 
12 

至於一個很好的教程退房Effective AWK Programming

1

下面是一個簡單的程序我剛剛颳起了(評論在線):

BEGIN { 
    # read the first line and save the number in 'a' 
    getline 
    a = $3   
    # read the second line and save the number in 'b' 
    getline 
    b = $3 
} 

# process the remaining lines 
{ 
    # print difference of this line's number and the number two rows back 
    print $3 - a 

    # shuffle the record keeping variables 
    a = b 
    b = $3 
} 

實例運行在你測試輸入:

$ awk -f example inputfile 
4 
17 
20 
12 
+0

這不會縮放.. –

+1

是的,你的回答比較好。 =) –

3

代碼

 
$ awk '{c=b;b=a;a=$3} c!="" {print $3-c}' file 
4 
17 
20 
12 

,更全面的,基於sudo_O的回答here

 
$ awk -v distance=1 'NR>distance{print $3-a[(NR-distance)%(distance+1)]}{a[NR%(distance+1)]=$3}' file 
1 
3 
14 
6 
6 

$ awk -v distance=2 'NR>distance{print $3-a[(NR-distance)%(distance+1)]}{a[NR%(distance+1)]=$3}' file 
4 
17 
20 
12 

$ awk -v distance=3 'NR>distance{print $3-a[(NR-distance)%(distance+1)]}{a[NR%(distance+1)]=$3}' file 
18 
23 
26 
+0

與@Carl Norum的答案相同,可以返回2行,但不會超出該範圍。 –

+1

是的,返回兩行:根據需要測量一行中包含的數字與前一行之前的行之間的差異。 – captcha

+0

@sudo_O這真的很好,所以你可以有一個「數組距離」:) - 謝謝。 – captcha

相關問題