在三列中的每一列中为每个地址添加一行

时间:2013-06-04 13:57:55

标签: ruby unix text sed

我需要在以下格式的文本文件中的每个地址的顶部添加一行:

g51/b18468 Postgg On 30/05/2013      N51/b39897 Postgg On 30/05/2013      LR51/b23428 Postgg On 30/05/2013
Rgv. XXXXX                           Mr. bBnMbNNbN.M                      Bro. bBRbgbM .S,
KbgbNg bSSgMBLY Og gOg,              LOT 92, KbMPUNg                      gRbgg gOMMUNnTY ggNTRg,
52, gLN. TnMUR,                      BbTU 4, 43950                        4, LORONg SS 23/6g,
POST BOX 20, 43007 KbgbNg            SUNgbn PgLnK                         47400 PgTbLnNg gbYb,
MbLbYSnb                             SgLbNgUR                             SgLbNgOR, W.MbLbYSnb
                                     MbLbYSnb                             MbLbYSnb


ML51/b13179 Postgg On 30/05/2013     W51/b41363 Postgg On 30/05/2013      Lg51/b29053 Postgg On 30/05/2013
Bro. bBRbgbM .V                      Bro. bLbPPbN                         Pbstor. bLgRgg PRbgbSbM
NO:18,PgRSnbRbN                      NO.60, LORONg SgRbn PgRMbn 9,        1-2-2, MggbN nNTbN bPbRTMgNT,
RnSgbg .7                            TbMbN SgRbn PgRMbn,                  gbLbN 1/21g Ogg gbLbN gOMBbK
TbMbN RnSgbg                         34300, BbTbN SgRbn,                  53000 KUbLb LUMPUR
30100 nPOg, PgRbK                    PgRbK                                MbLbYSnb
MbLbYSnb                             MbLbYSnb


LR510b13172 Postgg On 30/05/2013     ML51/b9877 Postgg On 30/05/2013      LR51/b9905 Postgg On 30/05/2013
Sns. bLLbMbg (b) NgSbM               Bro. bLVnN bNbNg .b                  Mrs. bNnTgb VngTOR
NO:44,gbLbN gbMbn                    NO:3,gbLbN TgRbTbn 3                 7,gbLbN PbRn
TbMbN TbPbg gbYb                     TbMbN SbRn,TgRbTbn                   PbRn gbRggNS
35000 TbPbg                          44000 KUbLb KUBU BgbRU               nPOg,30100
PgRbK,                               SgLbNgOR                             PgRbK
MbLbYSnb                             MbLbYSnb                             MbLbYSnb


ML51/b13180 Postgg On 30/05/2013     ML51/b13203 Postgg On 30/05/2013     g51/b9942 Postgg On 30/05/2013
Bro. bNTONY                          Bro. bNTONYSWbMY                     Pbstor. bROKnbNbTgbN
NO:399,LORONg KgNbVn 3/2b            LbgbNg gUSUN gURnbM                  NO:M4 g/7
TbMbN KgNbRn                         42700 BbNTnNg                        gbLbN PbNgbN nNgbg 4/1b
09000 KULnM                          SgLbNgOR g.g                         PbNgbN nNgbg
Kggbg                                MbLbYSnb                             55100,KUbLb LUMPUR
MbLbYSnb                                                                  MbLbYSnb

我为了安全和隐私而乱写了这些信件。我想要的是每个地址应该是这样的:

My New Line                          My New Line                          My New Line
g51/b18468 Postgg On 30/05/2013      N51/b39897 Postgg On 30/05/2013      LR51/b23428 Postgg On 30/05/2013
Rgv. XXXXX                           Mr. bBnMbNNbN.M                      Bro. bBRbgbM .S,
KbgbNg bSSgMBLY Og gOg,              LOT 92, KbMPUNg                      gRbgg gOMMUNnTY ggNTRg,
52, gLN. TnMUR,                      BbTU 4, 43950                        4, LORONg SS 23/6g,
POST BOX 20, 43007 KbgbNg            SUNgbn PgLnK                         47400 PgTbLnNg gbYb,
MbLbYSnb                             SgLbNgUR                             SgLbNgOR, W.MbLbYSnb
                                     MbLbYSnb                             MbLbYSnb

我不知道该怎么做。此处没有分隔符标记开始和结束。

4 个答案:

答案 0 :(得分:1)

使用地址文件中的行以这种或那种方式填充数组lines,然后:

new_line = 'My New Line                          My New Line                          My New Line'
lines.each_with_index do |line, index|
  if index.zero? or lines[index-1].blank?
    puts new_line
  end
  puts line
end

您可以根据需要将puts替换为文件,数组等输出。

答案 1 :(得分:1)

要在每条记录之前添加一行,请先将工具置于段落模式。这通常通过设置空记录分隔符来完成。然后在打印记录之前打印您的行。以下是使用awk

执行此操作的方法
awk '{ print (NR > 1 ? "\n\n" : "") "NEW\t\tNEW\t\tNEW" ORS $0 }' RS= file

由于您的列是固定宽度的,因此您需要调整空白的数量以便更新。我会留给你的。 HTH。

答案 2 :(得分:1)

以下是我在Ruby中的用法:

INPUT_FILE = 'test.txt'
OUTPUT_FILE = INPUT_FILE + '.new'
COLUMN_WIDTH = 37

File.open(OUTPUT_FILE, 'w') do |fo|
  # read using paragraph mode
  File.foreach(INPUT_FILE, '') do |paragraph_in|

    addr1_new_line = "My New Line"
    addr2_new_line = addr1_new_line
    addr3_new_line = addr1_new_line

    column1_new_line, column2_new_line, column3_new_line = [
      addr1_new_line,
      addr2_new_line,
      addr3_new_line
    ].map{ |nl|
      nl + (' ' * (COLUMN_WIDTH - nl.length))
    }

    fo.puts column1_new_line + column2_new_line + column3_new_line + "\n"
    fo.puts paragraph_in
  end
end

使用示例输出:

My New Line                          My New Line                          My New Line
g51/b18468 Postgg On 30/05/2013      N51/b39897 Postgg On 30/05/2013      LR51/b23428 Postgg On 30/05/2013
Rgv. XXXXX                           Mr. bBnMbNNbN.M                      Bro. bBRbgbM .S,
KbgbNg bSSgMBLY Og gOg,              LOT 92, KbMPUNg                      gRbgg gOMMUNnTY ggNTRg,
52, gLN. TnMUR,                      BbTU 4, 43950                        4, LORONg SS 23/6g,
POST BOX 20, 43007 KbgbNg            SUNgbn PgLnK                         47400 PgTbLnNg gbYb,
MbLbYSnb                             SgLbNgUR                             SgLbNgOR, W.MbLbYSnb
                                     MbLbYSnb                             MbLbYSnb

My New Line                          My New Line                          My New Line
ML51/b13179 Postgg On 30/05/2013     W51/b41363 Postgg On 30/05/2013      Lg51/b29053 Postgg On 30/05/2013
Bro. bBRbgbM .V                      Bro. bLbPPbN                         Pbstor. bLgRgg PRbgbSbM
NO:18,PgRSnbRbN                      NO.60, LORONg SgRbn PgRMbn 9,        1-2-2, MggbN nNTbN bPbRTMgNT,
RnSgbg .7                            TbMbN SgRbn PgRMbn,                  gbLbN 1/21g Ogg gbLbN gOMBbK
TbMbN RnSgbg                         34300, BbTbN SgRbn,                  53000 KUbLb LUMPUR
30100 nPOg, PgRbK                    PgRbK                                MbLbYSnb
MbLbYSnb                             MbLbYSnb

My New Line                          My New Line                          My New Line
LR510b13172 Postgg On 30/05/2013     ML51/b9877 Postgg On 30/05/2013      LR51/b9905 Postgg On 30/05/2013
Sns. bLLbMbg (b) NgSbM               Bro. bLVnN bNbNg .b                  Mrs. bNnTgb VngTOR
NO:44,gbLbN gbMbn                    NO:3,gbLbN TgRbTbn 3                 7,gbLbN PbRn
TbMbN TbPbg gbYb                     TbMbN SbRn,TgRbTbn                   PbRn gbRggNS
35000 TbPbg                          44000 KUbLb KUBU BgbRU               nPOg,30100
PgRbK,                               SgLbNgOR                             PgRbK
MbLbYSnb                             MbLbYSnb                             MbLbYSnb

My New Line                          My New Line                          My New Line
ML51/b13180 Postgg On 30/05/2013     ML51/b13203 Postgg On 30/05/2013     g51/b9942 Postgg On 30/05/2013
Bro. bNTONY                          Bro. bNTONYSWbMY                     Pbstor. bROKnbNbTgbN
NO:399,LORONg KgNbVn 3/2b            LbgbNg gUSUN gURnbM                  NO:M4 g/7
TbMbN KgNbRn                         42700 BbNTnNg                        gbLbN PbNgbN nNgbg 4/1b
09000 KULnM                          SgLbNgOR g.g                         PbNgbN nNgbg
Kggbg                                MbLbYSnb                             55100,KUbLb LUMPUR
MbLbYSnb                                                                  MbLbYSnb

诀窍是在阅读行时将Ruby置于“段落”模式。许多IO和File方法都有一个行分隔符的概念,AKA是一个神奇的$/变量。通过传递不同的值,Ruby将以不同的方式读取或写入文本文件。在这种情况下,通过传入一个空字符串,它将以“段落”模式读取,这意味着读取“行”直到找到两个连续的“\ n”。在大多数文本中,“\ n \ n”标记一个新段落。

这样做的副作用是我们不需要关心或知道,有多少行组成一个段落,因为Ruby会一直读到“\ n \ n “,自动做正确的事。我们只关心Ruby说它发现了另一段。

一旦Ruby读了一个段落,创建要输出的新行,确定列宽,然后输出新行,然后输出先前读过的段落,这是一个非常简单的任务。

我允许每个行和列有不同的标题。您可以根据需要调整addr1_new_lineaddr2_new_lineaddr3_new_line值。代码将根据需要自动调整列宽,以使它们保持对齐,只要它们短于列宽。

答案 3 :(得分:0)

另一种方式(假设addr中的输入文本并且每个段落中有固定数量的行):

str = "My New Line                          My New Line                          My New Line\n"
new_addr = addr.lines.each_slice(9).map{|el| str + el.join}