使用AWK处理选定的变量

时间:2014-09-22 09:46:58

标签: linux awk text-manipulation

我有一个SQL文件,我试图使用AWK进行操作。我有以下行在VALUES上拆分我的SQL文件,因为我想以不同的方式处理此字段之前和之后的文本。

原始文件如下所示:

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中删除反引号,使它看起来像这样:

$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') ");

有没有办法以不同的方式操纵变量?

4 个答案:

答案 0 :(得分: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 regexp更改为

即可
/drt_mig_user`\.|[\047`]/

答案 1 :(得分: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

答案 2 :(得分:0)

以上脚本适用于特定情况。

如果你想要一个适用于所有情况的标准脚本,那么你可以使用下面的脚本。它不会替换$ 1中的所有点(。)

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

答案 3 :(得分:-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