2014-09-22 90 views
0

我有一個SQL文件,我嘗試使用AWK進行操作。我有以下行分裂我的SQL文件VALUES,因爲我想處理這個領域之前和之後的文本不同。使用AWK處理選定的變量

原始文件看起來是這樣的:

INSERT INTO `drt_mig_user`.`parametric_object`(`id`, `active`, `priority`, `createdatetime`, `lastupdatedatetime`, `discriminator`) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate') 

我AWK代碼:

cat file.txt | awk -F'VALUES' '{printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2)}' 

將會產生這樣的:

$this->addSql("INSERT INTO `drt_mig_user`.`parametric_object`(`id`, `active`, `priority`, `createdatetime`, `lastupdatedatetime`, `discriminator`) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate') "); 

現在我需要做的是去除drt_mig_user並從整個第一個變量$1周圍移除反引號,使得t帽子它看起來像這樣:

$this->addSql("INSERT INTO parametric_object(id, active, priority, createdatetime, lastupdatedatetime, discriminator) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate') "); 

有沒有一種方法來操縱變量以這種單獨的方式?

+0

在第一個變量中沒有單引號('''),您有反引號('''')。你確實說過,你的實際輸入「看起來像這樣」,所以你的發佈樣本輸入實際上不是你實際輸入的樣子嗎?請在所有重要方面發佈與您的實際投入完全相同的樣本投入。 – 2014-09-22 12:52:20

+0

你說得很對,我現在編輯答案和問題 – JackalopeZero 2014-09-22 13:06:34

回答

1

您可以在打印結果前gsub結果。答案是:

awk -F'VALUES' '{gsub(/`/,"",$1); gsub("drt_mig_user.", "", $1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}' 

產生所需:

$this->addSql("INSERT INTO parametric_object(id, active, priority, createdatetime, lastupdatedatetime, discriminator) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate') "); 

本來我是想逃跑的單引號,而不是反單引號,因爲我是混淆了兩個人尋找一個問題的答案應該檢查出this SO answer

+1

忽略那個答案。在awk腳本中包含單引號的簡單方法是用'\ 047'來表示它們,例如, ''awk'BEGIN {print「there \ 047s one」}「'而不是用'awk'在awk和shell之間來回跳轉BEGIN {print」there'「'''s one」}「'。這兩個人都會打印出'有一個'。當然,更簡單的是,將awk腳本放在一個文件中,並在需要它們的地方使用文字單引號,然後使用'awk -f script ...'執行它,因爲這只是事實,即你正在分隔腳本用單引號引起的問題擺在首位。 – 2014-09-22 12:38:05

+0

謝謝,我會給\ 047一個去,而不是 – JackalopeZero 2014-09-22 12:52:29

+0

正如我在你的問題下面的評論中提到的,雖然,你張貼的示例輸入是使用反引號而不是單引號,所以如何處理單引號實際上是無關緊要的。另外:你應該刪除這個答案,並編輯你的問題,以包含任何相關信息。 – 2014-09-22 12:54:29

-1

如果你想,那麼你也可以使用一個簡單的循環爲此將

while read query do 
    first_part_temp=$(echo ${query} | awk -F 'VALUES' '{print $1}') 
    second_part=$(echo ${query} | awk -F 'VALUES' '{print $2}' file.txt) 
    first_part=$(echo $first_part_temp | sed s/\`//g | sed s/drt_mig_user.//g) 
    echo "\$this->addSql(\"${first_part} VALUES ${second_part} \");" >> output.txt 
done < file.txt 

或者,如果你想使用單條線,那麼你可以使用:

awk -F'VALUES' '{gsub(/`|drt_mig_user|\./,"",$1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}' file.txt 
+0

上面的shell腳本非常錯誤(不正確的使用讀取,沒有設置IFS,沒有引號的變量等),效率低下,並且完全是錯誤的方法。 awk腳本並不壞,但會刪除'$ 1'中的每個'.',而不是僅僅在drt_mig_user之後的'.',對於這個特定的1行輸入可以正常運行,但可能通常不受歡迎。 – 2014-09-22 13:26:35

3

爲了讓輸出你想從你發佈的輸入只是:

$ awk -F'VALUES' '{gsub(/drt_mig_user`\.|`/,"",$1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}' file 
$this->addSql("INSERT INTO parametric_object(id, active, priority, createdatetime, lastupdatedatetime, discriminator) VALUES ('10085', '1', NULL, '2014-09-19 16:18:39', '2014-09-19 16:18:39', 'gate')"); 

如果你在$ 1單引號,只是改變gsub正則表達式p到

/drt_mig_user`\.|[\047`]/ 
0

對於給定的情況,上面的腳本將正常工作。

如果你想要一個標準的腳本應該在所有情況下工作,那麼你可以使用下面的腳本。它不會替換$ 1中的所有點(。)

awk -F'VALUES' '{gsub(/`|drt_mig_user../,"",$1); printf("$this->addSql(\"%sVALUES%s\");\n", $1, $2);}' file.txt