2014-12-03 55 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. 
相關問題