在batch file中使用gawk我无法将格式从格式A重新格式化为格式B.

我有一个编译器,产生如下输出:

>>> 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 (

我有一个很好的去做,我可以得到第一个例子工作,但第二个例子搞砸了我,因为我没有弄明白与空格的文件名(谁这样做??>。<)。 这是我的awkgawk)代码:

 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" 

好的,所以第一点就是一团糟。 我将分解它解释我在做什么。 首先请注意,input是一个文件,它是我的构build生成的错误日志,我只是传入awk。 另外请注意偶尔在任何圆括号之前的“^”是因为这是在一个batch file的IF语句,所以我必须逃脱任何“)” – 除了其中之一…我不知道为什么! – 故障:

  • -F"[(^), ]" – 这是用“(”或“)”或“,”或“”分隔的,这可能是我们考虑使用空格的文件时的一个问题:(
  • '$2 == "Warning" {...} – 第二个参数是“Warning”的任何行。 我尝试使用IGNORECASE = 1,但我无法得到这个工作。 此外,我无法得到“警告”或“错误”的expression式,所以我只是重复整个awk行!
  • gsub("<",""^); gsub("\"",""); gsub("<",""^); gsub("\"",""); – 这是删除'<'和'”'(双引号),因为MSVS不希望文件名周围有引号……并且它似乎无法处理“ <”。 这里再次问题,如果我想获得空格的文件名?
  • start=$4"("$6","$7"^) : "$2" "$3":"; – 这个部分基本上将各种参数按照正确的顺序排列,并插入各种格式string。
  • $1=$2=$3=$4=$5=$6=$7=$8=$9=""; – 嗯…在这里我想打印第10个参数,之后每一个东西,一个伎俩(不能让别人的工作)是设置参数1-9“”,然后我会打印$ 0。
  • print start $0; – 最后一部分,这只是打印了我之前build立的string“开始”,后面是第9个参数之后的所有内容(请参阅上一点)。

所以,这对第一个例子是有效的 – 虽然它仍然有点垃圾,因为我得到以下内容(因为“(”是分割字符),因此缺less“(”

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):中的个别数字Line 10(5,7):如果我将括号和逗号分割,我可以find它们,但是最后我从注释中丢失了真正的括号/逗号。
  • 我可以更有效地打印出第10个元素和之后的所有元素(而不是$ 1 = $ 2 = … $ 9 =“”)
  • 我怎么能做到这一行,使$ 2 ==“警告”或“错误”

对不起,很长的问题 – 但我的awk线变得非常复杂!

恕我直言,如果不能提供真正的价值或其他真正需要的价值,最好不要让自己受制于注册表和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 

请注意,我已经使用选项卡分隔的字段。 如果你有什么空格或者其他的字符,只要用" "或者你需要的任何字符来代替。

正如许多人渴望的一线解决方案,在这里

 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 

IHTH