2010-05-31 91 views
2

我想添加一個到sed中的字符串結尾的最後一個值。 我正在考慮沿着一行使用sed和bc在一起?

cat 0809_data.csv |sed -e 's/\([0-9]\{6\}\).*\(,[^,]*$\)/\1\2/g'| export YEARS = $(echo `grep -o '[^,]*$' + 1`|bc) 

例如, 123456,kjhsflk,lksjgrlks,2.8 - > 123456,3.8

在awk中這會更合理/可行嗎?

回答

2

這應該工作:

years=$(awk -F, 'BEGIN{ OFS=", "} {print $1, $4+1}' 0809_data.csv) 

這將是非常尷尬的嘗試使用sed和做算術題,結果的一部分。你不得不拉開字符串並做數學運算,把所有的東西都放回去。 AWK沒有任何大驚小怪地做到了這一點。

注意cat是沒有必要的(即使是使用類似於一個在你的問題的命令sed),它可能不是必要的出口,除非你調用另一個腳本變量,需要它能夠訪問它作爲「全球」變量。另外,shell通常會進行整數運算,因此除非需要浮點數,否則不需要使用bc

+0

這看起來不錯。謝謝。 cat only_0809__data.csv | sed -e's/\([0-9] \ {6 \} \)。* \(,[^,] * $ \)/ \ 1 \ 2/g'| awk 'BEGIN {FS =「,」} {OFS =「,」} {print $ 1,$ 2 + 1} – Donnied 2010-05-31 16:53:23

+0

@Donnied:'OFS'應該在第一組大括號內(屬於'BEGIN'的)所以它只能執行一次而不是每行。沒有必要使用'cat'。你可以在AWK的同一個調用中做正則表達式的東西,也許使用'gsub',而不是使用'sed'。 – 2010-05-31 18:34:13