【问题标题】:Add a line to each address in each of the three columns [closed]在三列中的每一列中的每个地址中添加一行[关闭]
【发布时间】:2013-05-30 23:09:58
【问题描述】:

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

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

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

【问题讨论】:

  • 列是固定的,所以你基本上必须每 10 行插入一个静态行。
  • 没有必要寻求帮助。如果人们可以提供帮助,如果您已经编写了您的问题,那么他们会提供所需的信息。

标签: ruby unix text sed


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是我在 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
    

    带有样本输出:

    我的新线 我的新线 我的新线 g51/b18468 Postgg 开启 30/05/2013 N51/b39897 Postgg 开启 30/05/2013 LR51/b23428 Postgg 开启 30/05/2013 Rgv。 XXXXX 先生 bBnMbNNbN.M 兄弟。 bBRbgbM .S, KbgbNg bSSgMBLY Og gOg,LOT 92,KbMPUNg gRbgg gOMMUNnTY ggNTRg, 52, 液氮。 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 开启 30/05/2013 W51/b41363 Postgg 开启 30/05/2013 Lg51/b29053 Postgg 开启 30/05/2013 兄弟。 bBRbgbM .V 兄弟。 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 我的新线 我的新线 我的新线 LR510​​b13172 Postgg 开启 30/05/2013 ML51/b9877 Postgg 开启 30/05/2013 LR51/b9905 Postgg 开启 30/05/2013 Sns。 bLLbMbg (b) NgSbM 兄弟。 bLVnN bNbNg .b 夫人 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 开启 30/05/2013 ML51/b13203 Postgg 开启 30/05/2013 g51/b9942 Postgg 开启 30/05/2013 兄弟。安东尼兄弟bNTONYSWbMY Pbstor。破碎的NbTgbN 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 方法都有一个行分隔符的概念,也就是神奇的$/ 变量。通过传入不同的值,Ruby 将以不同的方式读取或写入文本文件。在这种情况下,通过传入一个空字符串,它将以“段落”模式读取,这意味着读取“行”直到找到两个连续的“\n”。在大多数文本中,“\n\n”标记一个新段落。

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

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

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

    【讨论】:

      【解决方案3】:

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

      awk '{ print (NR > 1 ? "\n\n" : "") "NEW\t\tNEW\t\tNEW" ORS $0 }' RS= file
      

      由于您的列是固定宽度的,因此您需要调整空白的数量来整理内容。我会把它留给你。 HTH。

      【讨论】:

        【解决方案4】:

        用地址文件中的行填充数组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 替换为文件、数组等的输出。

        【讨论】:

          猜你喜欢
          • 2023-04-03
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多