将pattern之间的多行转换为逗号分隔的字符串

时间:2014-12-03 13:15:47

标签: bash design-patterns awk sed multiline

我需要帮助处理来自STDIN的数据(数据来自另一个文件,其中'tail -f'加上grepped来过滤掉垃圾)。模式之间有几行:

    <DN>  589</DN>
    <DD>03.12.2014</DD>
    <ST>   </ST>
    <STC>0</STC>
    <STT>0</STT>
    <PU>5</PU>
    <OT>01</OT>
    <DSN></DSN>
    <NRA>40807,40820,426,30231,40818,30230</NRA>
    <GR>300 000-00&#13;&#10</GR>

然后启动DN / GR的下一个块

我需要在一行之间转换行,逗号分隔:

<DN>  589</DN>,<DD>03.12.2014</DD>,<ST>   </ST>,<STC>0</STC>,<STT>0</STT>,<PU>5</PU>,<OT>01</OT>,<DSN></DSN>,<NRA>40807,40820,426,30231,40818,30230</NRA>,<GR>300 000-00&#13;&#10</GR>

我需要一个带有awk或sed或perl的单线程来完成它并将结果放到STDOUT。 我试过这样做,但由于缺乏经验而失败了。也尝试谷歌,并没有找到一个有效的解决方案。

4 个答案:

答案 0 :(得分:2)

whatever..| awk '{sub(/^\s*/,"");printf "%s%s",$0,(/\/GR>\s*$/?"\n":",")}'

这一行确实:

  • 从每行中删除前导空格
  • 使用sep ,加入所有行,直到阻止结束/GR>
  • 如果您有x个数据块,它会为您提供x长行。

答案 1 :(得分:0)

使用awk可以执行以下操作:

awk '{printf ("%s,", $NF)}' test.txt ##Will have comma at the end which may/may not be ok for you.

答案 2 :(得分:0)

您可以在sed中使用以下内容。

sed -r ':loop ;N;s/(.*)\n(.*)/\1,\2/ ; t loop ' file name.

答案 3 :(得分:0)

sed -nr '/<DN>/,/<GR>/{ H; /<GR>/{ g; s%\n%,%g; s%^,%%; p; s%.*%%; h }; }' <<'EOSEQ'
<DN>  589</DN>
<DD>03.12.2014</DD>
<STC>0</STC>
<GR>300 000-00&#13;&#10</GR>
<DN>900</DN>
<DD>20.11.2014</DD>
<OT>01</OT>
<NRA>40807,40820,426,30231,40818,30230</NRA>
<GR>300 000-00&#13;&#10</GR>
EOSEQ

SED单行,如您所愿:)