Regex SED-组合匹配的正则表达式行以生成csv文件

Regex SED-组合匹配的正则表达式行以生成csv文件,regex,bash,sed,Regex,Bash,Sed,我想知道是否有可能使用sed通过将多行合并到一行(用逗号分隔)来创建csv文件 例如,我编写了一个sed语句来检索我想要的行 sed -n -e '/ENTITIES/,/ENDSEC/p' | sed -n -e '/ 8/{n;p;}' -e '/ 10/{n;p;}' -e '/ 20/{n;p;}' -e '/ 11/{n;p;}' -e '/ 21/{n;p;}' < Test.txt > out.csv 但我希望它能输出 0,4.93,9.04,27.9,23.4

我想知道是否有可能使用sed通过将多行合并到一行(用逗号分隔)来创建csv文件

例如,我编写了一个sed语句来检索我想要的行

sed -n -e '/ENTITIES/,/ENDSEC/p' | sed -n -e '/  8/{n;p;}' -e '/ 10/{n;p;}' -e '/ 20/{n;p;}' -e '/ 11/{n;p;}' -e '/ 21/{n;p;}' < Test.txt > out.csv
但我希望它能输出

 0,4.93,9.04,27.9,23.4
 0,34.56,0.77,66.65,19.50
 0,55.26,47.29,53.42,19.75
 0,-18.22,44.35,19.74,53.28
没有管道也可以这样做吗?我宁愿不调用另一个命令,因为我处理的文件超过100 mil行左右

提前感谢您的帮助

要添加,这里是我的输入文件的一部分

上面还有更多的东西

AcDbBlockEnd
  0
ENDSEC
  0
SECTION
  2
ENTITIES
  0
LINE
  5
1B1
330
1F
100
AcDbEntity
  8
0
100
AcDbLine
 10
4.933855223957067
 20
9.042372500389475
 30
0.0
 11
27.92566226775641
 21
23.49207557886149
 31
0.0
  0
LINE
  5
1B2
330
1F
100
AcDbEntity
  8
0
100
AcDbLine
 10
34.56437535704545
 20
0.778745874786317
 30
0.0
 11
66.65564369957746
 21
19.50612180407816
 31
0.0
  0
LINE
  5
1B3
330
1F
100
AcDbEntity
  8
0
100
AcDbLine
 10
55.26446832764479
 20
47.29118282642324
 30
0.0
 11
53.42718194719286
 21
19.75092411476788
 31
0.0
  0
LINE
  5
1B4
330
1F
100
AcDbEntity
ENDSEC
  0

下面还有更多内容。

像这样的东西可能是您正在寻找的,但正如jaypal所说,没有看到输入,这有点像猜测

sed -n '
  /ENTITIES/,/ENDSEC/p
  /  8/{n;h}
  / 10/{n;H}
  / 20/{n;H}
  / 11/{n;H}
  / 21/{n;H;g;s/\n/,/g;p}
' Test.txt > out.csv
谨此陈辞:

sed -n '
  /ENTITIES/,/ENDSEC/p
  /  8/{n;h}       # store next line in hold space
  / 10/{n;H}       # append next line to hold space (after newline)
  / 20/{n;H}       # ditto
  / 11/{n;H}       # ditto
  / 21/{n;H;       # ditto
        g;         # put hold space into pattern space
        s/\n/,/g;  # substitute commas for newlines
        p          # print it
       }
' Test.txt > out.csv

像这样的东西可能是你正在寻找的,但正如jaypal所说,没有看到输入,这有点像猜测

sed -n '
  /ENTITIES/,/ENDSEC/p
  /  8/{n;h}
  / 10/{n;H}
  / 20/{n;H}
  / 11/{n;H}
  / 21/{n;H;g;s/\n/,/g;p}
' Test.txt > out.csv
谨此陈辞:

sed -n '
  /ENTITIES/,/ENDSEC/p
  /  8/{n;h}       # store next line in hold space
  / 10/{n;H}       # append next line to hold space (after newline)
  / 20/{n;H}       # ditto
  / 11/{n;H}       # ditto
  / 21/{n;H;       # ditto
        g;         # put hold space into pattern space
        s/\n/,/g;  # substitute commas for newlines
        p          # print it
       }
' Test.txt > out.csv
把你的话告诉我就行了

sed 'your long sed commnand' | paste -d, - - - - -
结果将是

0,4.93,9.04,27.9,23.4
0,34.56,0.77,66.65,19.50
0,55.26,47.29,53.42,19.75
0,-18.22,44.35,19.74,53.28
把你的话告诉我就行了

sed 'your long sed commnand' | paste -d, - - - - -
结果将是

0,4.93,9.04,27.9,23.4
0,34.56,0.77,66.65,19.50
0,55.26,47.29,53.42,19.75
0,-18.22,44.35,19.74,53.28

多亏了ooga!在我缺乏对保持空间与模式空间的理解之前,现在一切都变得清晰了

sed -n '
    /ENTITIES/,/ENDSEC/{
         /  8/{n;h;};
         / 10/{n;H;};
         / 20/{n;H;};
         / 11/{n;H;};
         / 21/{n;H;g;s/\n/,/g;p};
    }
' < Test.dxf > out.csv           

多亏了ooga!在我缺乏对保持空间与模式空间的理解之前,现在一切都变得清晰了

sed -n '
    /ENTITIES/,/ENDSEC/{
         /  8/{n;h;};
         / 10/{n;H;};
         / 20/{n;H;};
         / 11/{n;H;};
         / 21/{n;H;g;s/\n/,/g;p};
    }
' < Test.dxf > out.csv           

建议查看中间输出有点棘手。您应该发布原始文件并解释所需的输出。看起来0行是记录分隔符Hi Jaypal!。祝大家好运。示例输入提供给代码时,不会生成示例输出。你能澄清一下你在寻找什么吗?是的,样本输入不能产生准确的样本输出。为了简单起见,我手动截断了示例输出。比如4.933855223957067和9.042372500389475,我截短到4.93和9.04。另外,看起来示例输入只生成示例输出的第一行树。就像我说的,只需采样,因为实际输入超过1亿行。建议查看中间输出有点棘手。您应该发布原始文件并解释所需的输出。看起来0行是记录分隔符Hi Jaypal!。祝大家好运。示例输入提供给代码时,不会生成示例输出。你能澄清一下你在寻找什么吗?是的,样本输入不能产生准确的样本输出。为了简单起见,我手动截断了示例输出。比如4.933855223957067和9.042372500389475,我截短到4.93和9.04。另外,看起来示例输入只生成示例输出的第一行树。就像我说的,只需采样,因为实际输入超过1亿行。@jaypal谢谢,伙计。听到一个同僚的话总是很高兴的-谢谢你的大力响应。不幸的是,它不太有效,整个输入文件都会打印出来。实体之前和ENDSEC之后的每一行的开头都插入了一个逗号。实体和ENDSEC之间的行在/8//10//20//11//21/regex之后的行首插入逗号。它离工作很近了!!!我想再做一些调整吧@jaypal@Mike尝试删除脚本的第一行,即去掉/ENTITIES/,/ENDSEC/p部分。谢谢ogga!我弄明白了,我收到了dos版本的文件,不同的换行符,所以把它转换成了nix。另外,如果您将/ENTITIES/、/ENDSEC/p替换为/ENTITIES/、/ENDSEC/{并在'Test.txt>out.csv之前添加一个},那么代码可以完美地工作!见下面我的答案。非常感谢你的帮助,没有你是不可能做到的@谢谢你,伙计。听到一个同僚的话总是很高兴的-谢谢你的大力响应。不幸的是,它不太有效,整个输入文件都会打印出来。实体之前和ENDSEC之后的每一行的开头都插入了一个逗号。实体和ENDSEC之间的行在/8//10//20//11//21/regex之后的行首插入逗号。它离工作很近了!!!我想再做一些调整吧@jaypal@Mike尝试删除脚本的第一行,即去掉/ENTITIES/,/ENDSEC/p部分。谢谢ogga!我弄明白了,我收到了dos版本的文件,不同的换行符,所以把它转换成了nix。另外,如果您将/ENTITIES/、/ENDSEC/p替换为/ENTITIES/、/ENDSEC/{并在'Test.txt>out.csv之前添加一个},那么代码可以完美地工作!见下面我的答案。非常感谢你的帮助,没有你是不可能做到的!