【问题标题】:awk processing single line with fields separated by semicolons failing with RSawk 处理单行,字段由分号分隔,RS 失败
【发布时间】:2016-09-17 16:35:09
【问题描述】:

我有一个包含内容的名为 strg.cfg 的文件

iMac;1;1;37;;Monitor;1;1;0;;Thunderbolt;1;0;0;;TimeMachine;0;0;0;;USB;1;0;0;;Lacie Stereo;0;0;0;;Rland MacMini;0;0;0;;Scanner;0;0;0;;end

记录由两个分号分隔;;和一个分号的字段。 我尝试使用以下 awk 文件处理此文件

BEGIN {FS=";"; RS="/\;\;/"}
{ print $1 ", " $2 ", " $3 ", " $6 }

$6 用作测试,因为如果它有效,它不应该为此打印任何内容,因为它只有四个字段。 但这似乎不起作用,好像根本没有考虑 RS= 。它仍将始终将整行​​视为记录。 以 6 美元打印“监视器”而不打印其他行。

【问题讨论】:

  • 分号没有什么特别之处,因此您无需转义它们。不过,在 RS 中使用多个字符的能力是 gawk 特有的 - 你在使用 gawk 吗?

标签: bash awk


【解决方案1】:

您没有显示预期的输出,所以我们只能猜测,但这是您想要的吗?

$ cat tst.awk
BEGIN {FS=";"; OFS=", "; RS=";;"}
RT{ print $1, $2, $3, $6 }

$ awk -f tst.awk file
iMac, 1, 1,
Monitor, 1, 1,
Thunderbolt, 1, 0,
TimeMachine, 0, 0,
USB, 1, 0,
Lacie Stereo, 0, 0,
Rland MacMini, 0, 0,
Scanner, 0, 0,

以上使用 GNU awk 进行多字符 RS 和 RT。如果您没有 GNU awk,那么最简单的解决方案是先将 ;;s 转换为通常的 RS (\n):

awk '{gsub(/;;/,"\n")}1' file | awk '....'

但如果您宁愿避免 2 次 awk 调用和管道,那么您可以这样做:

$ cat tst.awk
BEGIN {FS=";"; OFS=", "; RS=";"}
/^$/ {
    $0 = rec
    rec = ""
    print $1, $2, $3, $6
    next
}
{ rec = (rec ? rec FS : "") $0 }

$ awk -f tst.awk file
iMac, 1, 1,
Monitor, 1, 1,
Thunderbolt, 1, 0,
TimeMachine, 0, 0,
USB, 1, 0,
Lacie Stereo, 0, 0,
Rland MacMini, 0, 0,
Scanner, 0, 0,

【讨论】:

  • 对不起,我不够精确。我在 OS X 10.12 上,Ed Morton 的输出是我所期望的,但我只得到 iMac, 1, 1, Monitor 我猜它在 OS X 上并不笨拙,因此它不允许 l´multiple characters in RS : (
  • 在 OSX 上默认不是傻瓜。不过,您应该可以安装 gawk - 可以吗?
  • 我为您添加了一些非 gawk 解决方案。
  • 谢谢,效果很好。 JFYI 这样做的原因是在不打开浏览器的情况下查看我的网络控制插座条的状态。最好能够在将来将其添加到 AppleScript 中。完整的命令是“curl --silent --user username:password ip-address/strg.cfg | awk -f state.awk”。再次感谢,这帮助很大!
【解决方案2】:

Awk 结合了不同的命令。当您只想在选择字段之前用新行替换 ;; 时,您可以这样做

sed 's/;;/;\n/g' strg.cfg | cut -d";" -f1,2,3,6

或者替换结果中的一些东西

sed 's/;;/;\n/g' strg.cfg | cut -d";" -f1,2,3,6 | sed 's/;/, /g'

【讨论】:

    猜你喜欢
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多