【问题标题】:How to split a line into four lines如何将一行分成四行
【发布时间】:2011-06-02 19:43:52
【问题描述】:

我有一个很大的日志文件。在这个日志文件中,我有一些这样的行

AgentID:5000|Glass Manufacturing|Seattle|36
AgentID:5000|Shoe Manufacturing|Las Vegas|31

如果我对 AgentID:5000 进行 grep,那么我将获得与 Agent 5000 相关的所有记录。但是我需要像这样拆分报告。

AgentID: 5000

Company Name: Glass Manufacturing
HeadQuarter: Seattle
Number of employees: 36

Company Name: Shoe Manufacturing
HeadQuarter: Las Vegas
Number of employees: 31

这是一个日志文件所在的 linux 服务器,因此我可以使用所有 linux 技巧。如果需要,我可以编写 perl 或 ruby​​ 脚本。

什么是开始的最佳方式。我以前从未做过文本解析。我听说过 awk 和 sed,但还没有真正使用过。

只是寻找合适的工具来解决这个问题。

【问题讨论】:

  • 您是否有机会尝试编写一些代码让我们看看?

标签: shell command-line


【解决方案1】:
$ IFS='|' read id company hq empcount <<< 'AgentID:5000|Glass Manufacturing|Seattle|36'
$ echo "$id, $company, $hq, $empcount"
AgentID:5000, Glass Manufacturing, Seattle, 36

还有BASH FAQ entry #1

【讨论】:

    【解决方案2】:

    您列出的所有工具都是“正确”的工具,但我可能会选择带有 Text::CSV cpan 模块的 perl 选项:

    http://search.cpan.org/perldoc?Text%3A%3ACSV%3A%3ASeparator

    正如您在文档中看到的,竖线 (|) 是可用于检测的内置分隔符之一。

    这是一个简单的 perl 脚本的另一个链接,其中包含一些使用模块的文本解析:

    http://www.joelbdalley.com/page.pl?29

    毫无疑问,还有很多其他的例子很容易找到。

    【讨论】:

      【解决方案3】:

      为此,我会使用 emacs 宏。参见“宏”:

      http://swiss-knife.blogspot.com/2007/11/emacs-survival-kit.html

      【讨论】:

        【解决方案4】:

        Awk、sed 和 shell 都可以解决这个问题,而 1970 年代的工具在今天仍然很有价值,这充分证明了原始 Unix 实现者的集体天才。

        但是,如果这是我的问题,我会直接使用 Perl 或 Ruby,就像你提到的那样。

        这是一个 Ruby 实现。 ($ ruby whatever.rb &lt; file)

        E = [:'Company name', :'Headquarters', :'Number of employees']
        T = Struct.new *E
        while s = gets
          id, idn = fields = s.split(/[:|]/)
          puts "\nAgentID: " + idn unless idn == @idn
          puts
          @idn = idn
          line = T.new *fields[2..-1]
          puts E.map { |a| "#{a}: #{line[a]}" }
        end
        

        【讨论】:

          【解决方案5】:

          还没有人给你awk的答案,所以为了完整起见,这里是:

          awk -F'|' '
          BEGIN { 
              print "AgentID: 5000\n"; 
          } 
          /^AgentID:5000|/ { 
              print "Company name: ", $2, "\nHeadquarters: ", $3, "\nNumber of employees:", $4, "\n"; 
          }
          ' datafile
          

          【讨论】:

            【解决方案6】:

            这是你的脚本,(未经测试)

            case "$#" in
                0|1) echo "Usage: $0 filename agent_id[s]"; exit 1;;
                *) file=$1; shift;;
            esac
            
            for wanted in "$@"
            do
                echo "AgentID: $wanted"
                echo #empty line
                < "$file" grep "^AgentID *: *$wanted|" |(IFS=\|; while read id name hq num
                    do
                        echo "Company Name: $name"
                        echo "HeadQuarter: $hq"
                        echo "Number of employees: $num"
                        echo #empty line
                    done)
            done
            

            【讨论】:

              猜你喜欢
              • 2014-01-29
              • 1970-01-01
              • 2013-06-02
              • 2023-01-12
              • 2021-01-13
              • 1970-01-01
              • 2017-02-25
              • 2015-06-05
              相关资源
              最近更新 更多