我需要帮助处理来自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 
</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 
</GR>
我需要一个带有awk或sed或perl的单线程来完成它并将结果放到STDOUT。 我试过这样做,但由于缺乏经验而失败了。也尝试谷歌,并没有找到一个有效的解决方案。
答案 0 :(得分:2)
whatever..| awk '{sub(/^\s*/,"");printf "%s%s",$0,(/\/GR>\s*$/?"\n":",")}'
这一行确实:
,
加入所有行,直到阻止结束/GR>
答案 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 
</GR>
<DN>900</DN>
<DD>20.11.2014</DD>
<OT>01</OT>
<NRA>40807,40820,426,30231,40818,30230</NRA>
<GR>300 000-00 
</GR>
EOSEQ
SED单行,如您所愿:)