在批处理文件中使用GAWK我无法重新格式化从格式A到格式B线(Using gawk in a bat

2019-09-30 17:24发布

我有产生输出像一个编译器:

>>> Warning <code> "c:\some\file\path\somefile.h" Line <num>(x,y): warning comment

例如:

>>> Warning 100 "c:\some\file\path\somefile.h" Line 10(5,7): you are missing a (
>>> Warning 101 "c:\some\file\path\file with space.h" Line 20(8,12): unexpected char a

我需要获得进入格式(MSVS2013):

<filename-without-quotes>(<line>,<column>) : <error|warning> <code>: <comment>

例如,使用从上面的第一个例子:

c:\some\file\path\somefile.h(10,5): warning 100: you are missing a (

我曾在一个好去,我也只是获得第一个例子中的工作,但第二个例子欺负的我,因为我还没有想通的文件名用空格(谁做那个!?>。<)。 这里是我的AWK(GAWK)代码:

gawk -F"[(^), ]" '$2 == "Warning" {gsub("<",""^); gsub("\"",""); start=$4"("$6","$7"^) : "$2" "$3":"; $1=$2=$3=$4=$5=$6=$7=$8=$9=""; print start $0;}' "Filename_with_build_output.txt"
gawk -F"[(^), ]" '$2 == "Error"   {gsub("<",""^); gsub("\"",""); start=$4"("$6","$7"^) : "$2" "$3":"; $1=$2=$3=$4=$5=$6=$7=$8=$9=""; print start $0;}' "Filename_with_build_output.txt"

好了,1点是,它的一个烂摊子。 我会打破它来解释我在做什么。 首先要注意的是,输入是一个文件,这是我的构建产生的错误日志,我简单地传递到awk的。 另外要注意,偶尔“^”之前的任何一轮支架是因为这是一个批处理文件中IF语句,所以我逃避任何“)” - 除了其中的一个......我不知道为什么! - 因此,故障:

  • -F"[(^), ]" -这是分割线“(”或“)”或“”或‘’,当我们想想有空格的文件这可能是一个问题:(
  • '$2 == "Warning" {...} -任何行的第二个参数是‘警告’。 我试着用IGNORECASE = 1,但我无法得到那个工作。 此外,我不能让一个或表达式为“警告”或“错误”,所以我只是重复整个AWK符合两个!
  • gsub("<",""^); gsub("\"",""); gsub("<",""^); gsub("\"",""); -这是消除‘<’和“””(双引号),因为MSVS不希望与它周围的报价文件名...它似乎无法处理“ <”。 同样问题在这里,如果我想用空格的文件名?
  • start=$4"("$6","$7"^) : "$2" "$3":"; - 该部分基本上打乱的各种参数为正确的顺序插入的各种格式的字符串。
  • $1=$2=$3=$4=$5=$6=$7=$8=$9=""; - 嗯......我在这里想打印的第十个参数,之后每一件事情,一招(无法得到别人的工作)是设置PARAMS 1-9“”再后来我将打印$ 0
  • print start $0; - 最后的部分,这只是打印字符串“开始”,我建立了前面,然后第9参数后一切(见前面的点)。

所以,这个工程的第一个例子 - 尽管它仍然有点废话,因为我碰到下面的(缺少“(”末,因为“(”是分割字符):

c:\some\file\path\somefile.h(10,5): warning 100: you are missing a

而对于一个与空间,我得到的文件名(你可以看到文件名全部破损,而且一些参数是在错误的地方):

RCU(Line,20) : warning 101: : unexpected char a

因此,多个问题在这里:

  • 我怎样才能提取引号之间的文件名,但仍删除引号
  • 我怎样才能在各个数字Line 10(5,7):如果我劈在括号和逗号,我可以得到他们,但后来我失去了真正的支架/逗号从末注释。
  • 我可以更有效地打印出10元,之后的所有元素(而不是$ 1 = $ 2 = ... $ 9 =“”)
  • 我怎样才能让这个变成一个线,使得$ 2 ==“警告”或“错误”

对不起,长的问题 - 但我的AWK行正变得很复杂!

Answer 1:

恕我直言,这是最好不要让自己在REG-EX和花式绑起来FS值,如果他们不提供真正的价值或者是在真正需要的其他方式。 只需“剪切和粘贴”需要。 把下面的文件,

  {
    sub(/^>>> /,"")
    warn=$1 " " $2; $1=$2=""
    sub(/^[[:space:]][[:space:]]*/,"",$0)
    fname=$0
    sub(" Line.*$","",fname)
    gsub("\"","",fname);
    msg=$0
    sub(/^.*:/,"",msg)
    print fname ":\t" warn ":\t"msg 
}

然后,每@EdMorton最优秀的评论,运行它

 awk -f awkscript  dat.txt > dat.out

产量

c:\some\file\path\somefile.h:    Warning 100:     you are missing a (
c:\some\file\path\file with space.h:     Warning 101:     unexpected char a

请注意,我用制表符分隔。 如果空格或其他字符,只是子的什么\t字符与" "或任何你需要的。

正如许多渴望的一个班轮解决方案,这是

awk '{sub(/^>>> /,"");warn=$1 " " $2; $1=$2="";sub(/^[[:space:]][[:space:]]*/,"",$0);fname=$0;sub(" Line.*$","",fname);gsub("\"","",fname);msg=$0;sub(/^.*:/,"",msg);print fname ":\t" warn ":\t"msg}'  dat.txt

我ःŤः



文章来源: Using gawk in a batch file I am having trouble reformatting lines from format A to format B
标签: windows awk gawk