在awk中连接字符串

在awk中连接字符串,awk,Awk,我有一个需要在服务器上“重播”的日志文件 它包含如下条目: Request: query: EXEC prc_insert_customer @param0: 110040851 @param1: 137463 @param2: user@example.com @param3: John @param4: Smith @param5: Some address @pa

我有一个需要在服务器上“重播”的日志文件

它包含如下条目:

Request:
        query: EXEC prc_insert_customer
        @param0: 110040851
        @param1: 137463
        @param2: user@example.com
        @param3: John
        @param4: Smith
        @param5: Some address
        @param6:
        @param7:
        @param8: Some city
        @param9: GBR
        @param10: POSTCODE
        @param11: (555) 123-45-67
Response:

...
我需要把这样的每一块转换成

EXEC prc_insert_customer '110040851', '137463',  ..., '(555) 123-45-67'
我试着用awk来解决这个问题:

/EXEC prc_insert_customer/ {
        str = "EXEC prc_insert_customer";
}

str && /@param/ {
        if ($1 == "@param0:")
                sep = ""
        else
                sep = ","
        str = ((str) (sep) " '"($2) ("'"))
}

/^Response/ {
        if (str)
                print str
        str = ""
}
但我得到的结果是:

', '(555)'DE', '', 'Some', 'GBR0851
如何获得正确的输出


我在
Fedora 17
上使用
GNU Awk 4.0.0
,对这个代码片段稍加修改即可:

BEGIN { processing = 0 }
/^Request/ { processing = 1 }
/^Response/ { processing = 0 }

{
    if (! processing)
        next

    if ($1 ~ /^@param/)
    {
        sep = ($1 == "@param0:" ? "" : ", ")
        rest = "'"
        for (i = 2; i <= NF; ++i)
            rest = rest (i == 2 ? "" : " ") $i
        rest = rest "'"

        str = str sep rest
    }
    else if (str != "")
    {
        print "EXEC prc_insert_customer", str
        str = ""
    }
}

使用Mac OSX上的
awk版本20070501
GNU awk 4.0.0
进行测试。

如果日志文件基于Windows,则几乎可以肯定您正在处理邪恶^M字符的副作用(影响?;->)。正如你所描述的,它肯定会产生问题

 sub(/^M/,"", $0)
应该有帮助

这是一个真正的Ctrl-M字符,而不是按Ctrl-V和Ctrl-M在符合vi标准的编辑器中生成的两个字符“^”和“M”


我希望这有帮助。

它输出记录行,后跟
,(555)123-45-67omstomer 110040851
编辑后,输出略有变化:
,'(555)123-45-67tyomer'110040851
。仍然以日志行作为前缀。使用方便的
/from/,/to/
语法时,似乎无法避免打印输入行。新版本不会向我打印任何内容。您使用的是哪个
awk
版本?我使用
awkversion20070501
gnuawk4.0.0
对其进行了测试,并在这样调用时收到一致的输出:
awk-f test.awk
。我会使用
sub(/\r/,“”,$0)
,这样您的脚本中就不会出现混乱的断行。您也可以使用
/\015/
 sub(/^M/,"", $0)