如果相关,我已经从sourceforge中的GNU指向源代码直接下载了GNU awkV3.1.6。
我得到了一个网页的网址使用wget的窗口。在处理传入的文件之后,我将其缩减为一行,我必须从其中提取一个键值,这是一个相当长的字符串。最后一行类似如下所示:
<ENUM_TAG>content"href:e@5nUtw3Fc^b=tZjqpszvja$sb=Lp4YGH=+J_XuupctY9zE9=&KNWbphdFnM3=x4*A@a=W4YXZKV3TMSseQx66AHz9MBwdxY@B#&57t3%s6ZyQz3!aktRNzcWeUm*8^$B6L&rs5X%H3C3UT&BhnhXgAXnKZ7f2Luy*jYjRLLwn$P29WzuVzKVnd3nVc2AKRFRPb79gQ$w$Nea6cA!A5dGRQ6q+L7QxzCM%XcVaap-ezduw?W@YSz!^7SwwkKc"</ENUM_TAG>我需要两个“星座”之间的长线。
所以我在awk中使用了这个结构
type processedFile | awk -F "\"" "{print $2}"并且我得到了预期的输出
href:e@5nUtw3Fc^b=tZjqpszvja$sb=Lp4YGH=+J_XuupctY9zE9=&KNWbphdFnM3=x4*A@a=W4YXZKV3TMSseQx66AHz9MBwdxY@B#&57t3%s6ZyQz3!aktRNzcWeUm*8^$B6L&rs5X%H3C3UT&BhnhXgAXnKZ7f2Luy*jYjRLLwn$P29WzuVzKVnd3nVc2AKRFRPb79gQ$w$Nea6cA!A5dGRQ6q+L7QxzCM%XcVaap-ezduw?W@YSz!^7SwwkKc但是,当我运行相同的命令并将输出重定向到一个文件时,例如
type processedFile | awk -F "\"" "{print $2}" > tempDummy我收到这个错误消息:
awk: cmd. line:1: fatal: cannot open file `>' for reading (Invalid argument)我认为\“字段分隔符给我带来了一些痛苦,并将最后一个”字符设置为非闭合字符串值,但我不确定如何正确处理此问题。顺便说一句,同样的结构在我的centos机器上运行得很好。
任何指针都是非常感谢的。我尝试阅读我能找到的所有自述文件,但它们都没有触及输出重定向。
发布于 2019-11-01 23:37:12
是的,您在cmd解析器如何处理带引号的区域的开始/结束位置方面存在问题。cmd看到的是
awk -F "\"" "{print $2}" > tempDummy
^-^^-^ ^-------------
1 2 3也就是说,三个引用的区域。由于>落在带引号的区域内,因此它不会作为重定向运算符处理,它是管道右侧的命令的参数。
这可以通过转义引号(^是cmd的通用转义字符)来解决,以确保cmd在解析该行之后正确地生成最终命令,并且重定向不是awk命令的一部分
type processedFile | awk -F ^"\"" "{print $2}" > tempDummy
^^ ^..........^或者,您可以对命令重新排序,将重定向操作放在它不能干扰的位置
type processedFile | > tempDummy awk -F "\"" "{print $2}"但是,尽管这种方法可以工作,但在其他情况下,使用这种方法可能会失败,因为awk代码({print $2})被放在未加引号的区域中。
有一种更简单、标准、可移植的方法,无需处理引号转义:最好使用awk字符串处理,只包含引号字符的转义序列,而不是将引号作为参数传递
type processedFile | awk -F "\x22" "{print $2}" > tempDummy发布于 2019-10-31 15:51:34
你们已经很接近了。这里的问题是,您将awk重定向与cmd one混合在一起。
为了完整起见,我使用的是MSYS2 awk版本(在这个问题上,版本不是问题):
awk --version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)Windows版本在这种情况下是无关紧要的-将在Win7和Win10上运行
您的命令:
type processedFile | awk -F "\"" "{print $2}" > tempDummy使用>,您希望它是一个cmd.exe重定向,但awk需要一个文件,因此您会得到错误:awk: cmd. line:1: fatal: cannot open file ``>'
1)修复重定向
您可以通过直接在awk上执行重定向来修复
type processedFile | awk -F "\"" "{ print $2 > "tempDummy"; }"2)使用awk读取文件
这里的type命令是多余的,因为您可以直接使用awk来读取文件:
awk -F "\"" "{ print $2 > "tempDummy"; }" processedFile不要忘记注意:需要注意的是,GNU是区分大小写的,但是windows的默认文件系统设置是不区分大小写的。
https://stackoverflow.com/questions/58600842
复制相似问题