2010-09-10 31 views
2

我用正則表達式在之前sed和有點用的awk,但我不確定確切的語法我需要在這裏...如何在Awk或Sed中將數學與正則表達式混合使用?

我想要做的事,如:

sed -i 's/restartfreq\([\s]\)*\([0-9]\)*/restartfreq\1$((\2/2))/2/g' \ 
    my_file.conf 

其中第二場比賽除以2,然後放回內聯編輯。

我讀過雖然該sed不能做數學。

我可以用sed或awk單獨乾淨嗎?建議請。

編輯1
我想我詢問的意思是足夠簡單,但我想我可能沒有給我想要修改的數據足夠好的樣本。這裏是我的* .conf文件中的行的例子,我想在內部編輯:

restartfreq  1250 ;# 2500steps = every 1.25 ps 

我已經在下面發佈了一個解決方案。我收到的兩個答案都是關於向終端打印文本,而不是內聯編輯文件。我儘量避免回答我自己的問題,但在這種情況下,我收到的答案都沒有真正做到我所要求的(編輯文件,而不僅僅是打印經過編輯的行),而且它們比我的解決方案和/或需要更多的Linux要長得多除awk或sed之外的程序。

雖然我很欣賞幫助和反饋! :)

注:作爲我通常的聲明,這不是一個家庭作業問題,我是一個化學工程研究員。

+0

或許,這將有助於查看了一下樣本數據和期望的輸出是什麼樣子去做。 – 2010-09-10 16:34:06

+0

restartfreq 1250;#2500steps =每1.25 ps – 2010-09-10 18:31:21

回答

1

這是你如何使用awk只有

awk '$1=="restartfreq"{$2=$2/2;}1' file > t && mv t file 
+0

不錯,比我的解決方案短,相當大! :) – 2010-09-13 15:16:53

0

這可能是一起的,你在找什麼線路:

$ echo 'restart 4' | awk '{$2=$2/2; print}' 
restart 2 
+0

是的,但是如果重啓行在文件中,您可以進行內聯編輯嗎?請注意我的sed命令中的-i。附:感謝您的幫助,您總是對我的問題給予很好的迴應! – 2010-09-10 17:29:10

+0

@Jason:我建議你使用ghostdog74顯示的臨時文件。 – 2010-09-11 01:06:50

2
$ cat script.awk 
/restartfreq *[0-9]+/{ 
    $2 = $2/2 
} 
{print} 
$ awk -f script.awk my_file.conf 

如果你總是希望數是整數,改變$2/2int($2/2)


覆蓋文件,你既可以使用海綿(如果你有moreutils提供)或臨時文件。

後者應該是不言自明的。
海綿讓你做:

$ awk -f script.awk my_file.conf | sponge my_file.conf 
+0

我在一個bash腳本里面。我應該嘗試嵌套你的awk腳本嗎?另外,如果我沒有弄錯,只是打印這些值,它不會內聯編輯文件...請注意我的sed命令中的「-i」選項。我需要使用正則表達式在我的文件中實際找到該行,將數字除以2,然後將該修改*寫入文件。謝謝! – 2010-09-10 17:31:53

0

下面的解決方案實際上編輯文件內聯,只使用一個命令,是比其他提出的解決方案(恕我直言)更優雅一點。

awk '{gsub(/restartfreq\s*[0-9]+/,$2/2,$2)}' my_file.conf 

對丹尼斯等人的道歉。人回答我自己的問題,但我覺得這是最好的解決辦法,希望哎呀我說謊這將有利於其他人誰讀這...

編輯1

。那也只是打印到終端上...

我花了很久才找到,但這個工程,只用sed和awk:

sed -i '/restartfreq/s/'`sed -n 's/restartfreq*/&/p' my_file.conf | awk '{print $2}'`'/'`sed -n 's/restartfreq*/&/p' my_file.conf | awk '{print $2/2}'`'/g' my_file.conf 

也許這可以簡化,但至少它的工程! :)

+0

你確定你的最終答案有效嗎? – ghostdog74 2010-09-10 23:15:37

+1

我會*非常高*建議您使用臨時文件而不是**! – 2010-09-11 01:08:13

+0

@ Ghostdog74,是的,雙重檢查。唯一不可取的是我想使用天花板功能來確保數字四捨五入。 – 2010-09-13 15:15:22