在Mawk工作;但不是在Awk

时间:2014-07-29 17:20:55

标签: bash awk

这可能是一个难以解决的问题,可能是一个死的简单修复,它瞪着我的眼睛,我只是看不到它。

尝试为文件piece1.txt运行此awk命令:

    awk 'BEGIN { RS = "href=\""; ORS = ""; FS = OFS = "\"" } NR > 1 {  gsub("~", "", $1); gsub("!", "", $1); gsub("%20", "_", $1); gsub("#", "", $1); gsub("$", "", $1); gsub("%", "", $1); gsub("^", "", $1); gsub("&", "_", $1); gsub("@", "", $1); gsub("*", "", $1); gsub("\(", "", $1); gsub("\)", "", $1); gsub(/ /, "_", $1); gsub("____", "_", $1); gsub("___", "_", $1); gsub("__", "_", $1); print RS } 1' piece1.txt

输出错误:

    awk: cmd. line:1: (FILENAME=piece1.txt FNR=2) fatal: Unmatched ( or \(: /(/

似乎在指定的第一个“href =”实例之前运行cmd,然后擦除txt文件的其余部分。

我被引导相信我的代码中存在一个我忽略的问题。但奇怪的是,这段代码在Debian / Ubuntu Distro中完美运行(MAWK是默认的)。这只是在Mint KDE发行版中的GNU Awk中,我收到了这个错误。

如果相关:

    > awk --version
    > GNU Awk 4.0.1

任何帮助?

1 个答案:

答案 0 :(得分:2)

您需要进一步引用正则表达式字符串,因为您使用""来封装它们而不是//

awk 'BEGIN { RS = "href=\""; ORS = ""; FS = OFS = "\"" } NR > 1 {  gsub("~", "", $1); gsub("!", "", $1); gsub("%20", "_", $1; gsub("#", "", $1); gsub("$", "", $1); gsub("%", "", $1); gsub("^", "", $1); gsub("&", "_", $1); gsub("@", "", $1); gsub("*", "", $1); gsub("\\(", "", $1); gsub("\\)", "", $1); gsub(/ /, "_", $1); gsub("____", "_", $1); gsub("___", "_", $1); gsub("__", "_", $1); print RS } 1' piece1.txt

这是已更改的部分:gsub("\\(", "", $1); gsub("\\)", "", $1);

我建议您更改模式并改用//。它也更有效率。

您可能会发现这也更简单:

awk 'BEGIN { RS = "href=\""; ORS = ""; FS = OFS = "\"" } NR > 1 { gsub(/(%20|_)+/, "_", $1); gsub(/[~!#$%^&*()@]/, "", $1); print RS } 1' piece1.txt

或者

awk 'BEGIN { RS = "href=\""; ORS = ""; FS = OFS = "\"" } NR > 1 { gsub(/%20/, "_", $1); gsub(/[~!#$%^&*()@]/, "", $1); gsub(/_+/, "_", $1); print RS } 1' piece1.txt