2014-07-16 64 views
4

我有一個需要在圖案之間插入兩條線的CNC機器的G代碼文件。基本上我需要編寫一個簡單的後處理器。 這是一個很小的代碼片斷從我的CAM程序:兩個圖案之間的awk/sed插入線

G00 X-1.663 Y-0.992 Z+0. 
G01 X-1.072 Y-0.992 
G01 X-1.072 Y-0.874 
G01 X-1.663 Y-0.874 
G01 X-1.663 Y-0.992 
G00 X-3.021 Y-0.992 
G01 X-3.021 Y-0.874 
G01 X-2.43 Y-0.874 
G01 X-2.43 Y-0.992 
G01 X-3.021 Y-0.992 

我需要插入的順序一個G00和G01之間的兩條線。所以,上面的例子,現在將變成:

G00 X-1.663 Y-0.992 Z+0. 
M51 
M04 F.1 
G01 X-1.072 Y-0.992 
G01 X-1.072 Y-0.874 
G01 X-1.663 Y-0.874 
G01 X-1.663 Y-0.992 
G00 X-3.021 Y-0.992 
M51 
M04 F.1 
G01 X-3.021 Y-0.874 
G01 X-2.43 Y-0.874 
G01 X-2.43 Y-0.992 
G01 X-3.021 Y-0.992 

我需要的另一件事是換行必須是Windows/DOS風格在末端\ r \ n。這與需要DOS文本文件的舊式,易變的CNC控制器有關。我可以使用另一個awk或sed腳本,但一個班輪將是首選。 我嘗試:

awk '/G00/,/G01/{print $0 RS "M51" RS "M04 F.1";next}1' FILE 

但線ANY G00或G01之後。我只需要在G00和G01之間。 還有一件事,我更喜歡單行命令。 謝謝!

+0

爲什麼在'G00'和'G01'。不會'awk'/ G00/{$ 0 = $ 0 RS「M51」RS「M04.F1」} 1'file'夠了嗎? – user000001

+0

因爲可能有多個G00命令並且在它們之間添加重複的命令會添加不必要的行並佔用寶貴的文件空間。 CNC控制器文件空間的測量單位是千字節,因爲它是1987年生產的舊allen bradley 8400. –

+0

對於明確問題,其答案可以概括爲+1。 :) – zx81

回答

4

使用awk的你可以這樣做:

awk '$1=="G00"{p=1} p && $1=="G01"{print "M51"; print "M04 F.1"; p=0} 1' file 
G00 X-1.663 Y-0.992 Z+0. 
M51 
M04 F.1 
G01 X-1.072 Y-0.992 
G01 X-1.072 Y-0.874 
G01 X-1.663 Y-0.874 
G01 X-1.663 Y-0.992 
G00 X-3.021 Y-0.992 
M51 
M04 F.1 
G01 X-3.021 Y-0.874 
G01 X-2.43 Y-0.874 
G01 X-2.43 Y-0.992 
G01 X-3.021 Y-0.992 
+0

哇!那很快。奇蹟般有效。非常感謝你。你的awk fu很強大。 –

+0

很高興知道它解決了問題,您是否可以通過點擊我答案左上角的刻度線標記答案。 – anubhava

+0

@ zx81完成。謝謝你的提示。 –

3

你可以使用這樣的事情:

awk 'last=="G00" && $1=="G01" {print "M51\nM04 F.1"} {last=$1} 1' file 

如果前行的第一個字段是「G00」和當前的第一場行是「G01」,然後打印這兩行。

輸出:

G00 X-1.663 Y-0.992 Z+0. 
M51 
M04 F.1 
G01 X-1.072 Y-0.992 
G01 X-1.072 Y-0.874 
G01 X-1.663 Y-0.874 
G01 X-1.663 Y-0.992 
G00 X-3.021 Y-0.992 
M51 
M04 F.1 
G01 X-3.021 Y-0.874 
G01 X-2.43 Y-0.874 
G01 X-2.43 Y-0.992 
+0

很抱歉,如果這是顯而易見的,但'awk'程序末尾'1'的目的是什麼? –

+1

它的計算結果爲true,因此awk執行默認操作,即打印該行。 Longhand將是'{print $ 0}',或者只是'{print}'。 –