2012-05-30 63 views
2

我想使用awksed搜索並替換文件列中的空白和點。搜索並替換文件列中的空白和點

該文件的內容是:

02-01-12 28.46 
02-02-12 27.15 
02-03-12 
02-04-12 27.36 
02-05-12 47.57 
02-06-12 27.01 
02-07-12 27.41 
02-08-12 27.27 
02-09-12 27.39 
02-10-12 . 
02-11-12 27.44 
02-12-12 49.93 
02-13-12 26.99 
02-14-12 27.47 
02-15-12 27.21 
02-16-12 27.48 
02-17-12 27.66 
02-18-12 27.15 
02-19-12 51.74 
02-20-12 27.37 

的圓點和空值,可以將出現在文件中的任何行,我想更換空,點上面的值,也就是說,

02-01-12 28.46 
02-02-12 27.15 
02-03-12 27.15  ****** replace with the above value 
02-04-12 27.36 
02-05-12 47.57 
02-06-12 27.01 
02-07-12 27.41 
02-08-12 27.27 
02-09-12 27.39 
02-10-12 27.39  ****** replace with the above value 
02-11-12 27.44 
02-12-12 49.93 
02-13-12 26.99 
02-14-12 27.47 
02-15-12 27.21 
02-16-12 27.48 
02-17-12 27.66 
02-18-12 27.15 
02-19-12 51.74 
02-20-12 27.37 

回答

1

以下awk腳本應該工作:

BEGIN { 
    last="00.00" 
} 

{ 
    if ($2 != "" && $2 != ".") { 
     last=$2 
    } 
    print $1 " " last 
} 
1
$ awk -v prev=00.00 'NF<2 || $2=="." { print $1, prev; next }{prev=$2}1' input-file 
+0

怎麼樣我有一個文件有4列,說第一列是日期,另外3列是數字 –

+0

對於多列,使用awk很難替換空白字段,因爲awk將無法輕鬆區分具有4個字段的行,其中2個爲空,只有2個字段,所以我會假設你只是替換「。」的字段。 'awk'{for(i = 1; i <= NF; i ++)if($ i ==「。」)$ i = p [i] else p [i] = $ i} 1'' –

3

這可能會爲你工作(GNU SED):

sed -i '$!N;s/^\(.\{9\}\(.*\)\n.\{9\}\)\.\?$/\1\2/;P;D' file 
+0

哇。我的命令是三倍。我現在不會發布它:)你甚至不使用保持空間!這只是我的想法。附:雖然你在用這個''{9}'的東西作弊。這看起來有點危險。 –

2
awk 'BEGIN {prev = "00.00"} NF < 2 || $2 == "." {$2 = prev} {prev = $2; print}' filename 

如果您有可能會丟失數據的多個列:

awk 'BEGIN {p = "00.00"} {for (i = 1; i <= NF; i++) {if (! $i || $i == ".") {if (prev[i]) {$i = prev[i]} else {$i = p}}; prev[i] = $i}; print}' filename 
+0

我有一個文件有4列,說第一列是日期,另外3列是數字 –

+0

@IvanChan:如果列2是唯一一個缺少值,這應該仍然工作。如果在其他列中可能缺少值,則應該在問題中更全面地指定您的問題。可以使用類似的技術。你只需要遍歷這些字段,'prev'需要是由字段編號索引的數組。看到我編輯的答案。 –