繁体   English   中英

awk处理单行,其字段由分号分隔,RS失败

[英]awk processing single line with fields separated by semicolons failing with RS

我有一个名为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美元的价格打印“显示器”,而不打印其他行。

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

$ 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,

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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM