2012-12-08 41 views
3

我想用awk命令比較文件中的連續行。這是一個輸入和輸出的例子。比較awk中的連續行

輸入文件

6  
7  
8  
9  
10  
4  
5  
6 

我想有輸出文件是這樣的:

6 
7 
8 
9 
10 
14 
15 
16 

基本上,我想比較,如果當前行是比前一個更大,繼續打印以前和當前行。只要當前行少於前一行,爲每個後續行添加一個值(10)。

回答

4

更新爲每個請求的評論

awk '{if ($1<prev) {offset++}; print ($1+(offset*10)); prev=$1}' input_file 

現在,這將增加增量的10每次從一個更大的數量去連續行之間的數量較少時間偏移。

+0

謝謝。我現在有第二種情況,我不得不爲第一種情況添加(10),但現在我必須爲第二種情況添加(20)):輸入文件6 7 8 9 10 | 4 5 6 | 1 2 3輸出6 7 8 9 10 | 14 15 16 | 21 22 23 – Yacob

+0

@Yacob看到更新的答案。這將爲30,40,50 ...等等。 –

1

你將不得不保存在變量的前值,並比較與:

awk '{ if ($0 < old) { $0 += 10; } print; old = $0; }' 
+1

在這個數據文件的上下文中,你可以使用'$ 1'來代替'$ 0'(系統地)。還要注意,如果一行是28,下一行是9,則輸出值將是19,而不是29(因此不能保證數據在通過此腳本後單調遞增)。 –

+0

我不確定你在問什麼,@Yacob,但有一種可能性可能是用'while'替換'if'。如果輸入中需要執行循環的情況很多,那麼計算(乘法,除法等)會比迭代法更好(因爲基本上增加了足夠的10個以使當前行大於前一行,沿$ 0 + = 10 * int((old - $ 0 + ff)/ 10)行;',其中'ff'是我沒有坐的合適的撫摸因子下來並制定出來)。 –

2
awk '$0<p{$0+=10} {p=$0} 1' file