2014-12-03 49 views
1

我需要帮助处理来自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。 我试过这样做,但由于缺乏经验而失败。也试图谷歌,并没有找到一个工作解决方案。

+1

'TR '\ n' '' 2014-12-03 13:17:53

回答

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一个内胆,如你所愿:)

+0

谢谢,这个工作! – 2014-12-04 10:35:13

0

使用awk的,你可以做到以下几点:

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

除了后面的逗号,你砍如果开始标签功能有是标签文本中的空格。 – Kent 2014-12-03 13:30:23

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

这一行做:

  • 从每行
  • 加入所有符合九月,,直到删除前导空格块结尾/GR>
  • 如果你有x个数据块,它给出你x线很长。
0

你可以在sed中使用下面的一个。

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