【问题标题】:Can I have multiple awk actions without inserting newlines?我可以在不插入换行符的情况下进行多个 awk 操作吗?
【发布时间】:2017-08-01 01:34:01
【问题描述】:

我是一个新手,有非常小的和特定的需求。我正在使用 awk 来解析某些内容,并且我需要生成不间断的文本行,这些文本行由原始文本中的多个部分组合而成。 但每当我使用分号时,awk 都会在输出中插入换行符

我的意思的最简单的例子:

原文:

1 2

awk 命令:

{ print $1; print $2 }

输出将是:

1
2

问题是我需要输出是单行,而且我还需要使用分号,因为我要对原文做多个动作,而不是全部打印 .

另外,使用 ORS=" " 会导致很多不同的问题,所以它不是一个选项。

有没有其他方法可以在同一行中执行多个操作而无需插入换行符?

谢谢!

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    输出中的换行符与您在脚本中使用分号分隔语句无关,它们是因为print 输出您给它的参数后跟ORS 的内容和@987654323 的默认值@ 是换行符。

    您可能需要以下任一版本:

    $ echo '1 2' | awk '{printf "%s ", $1; printf "%s ", $2; print ""}'
    1 2 
    $
    
    $ echo '1 2' | awk -v ORS=' ' '{print $1; print $2; print "\n"}'
    1 2
     $
    
    $ echo '1 2' | awk -v ORS= '{print $1; print " "; print $2; print "\n"}'
    1 2
    $
    

    但是如果不知道更多关于你想要做什么的事情就很难说。

    在尝试使用 awk 编程之前,至少浏览一下 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书,以了解一些基础知识,否则你将浪费大量时间并学到很多不好的东西习惯第一。

    【讨论】:

    • @John1024 - $ 故意显示第二版将在行尾之前添加的虚假空间。
    • 对于第二个例子,我建议echo '1 2' | awk -v ORS=' ' '{print $1; print $2; printf "\n"}',因为它消除了额外的空间。
    • 好的。它让我觉得很奇怪,因为它与其他示例缺乏平行性。
    • 不,它只是将它隐藏在行尾。我希望它是可见的,所以 OP 知道他得到了什么。是的,我知道它在第一个中不可见,但它仍然存在。它们是 3 个不同的输出示例。
    • 回滚。如果所有人都有以下提示,而不仅仅是一个提示,那就更清楚了。 (无论如何+1)。
    【解决方案2】:

    如果您使用printf,您可以更好地控制输出,例如

    awk '{ printf "%s %s\n",$1,$2 }'
    

    【讨论】:

    • printf 中硬编码换行符是个坏主意,这会使您的脚本平台特定于特定平台,请改用默认的ORS
    【解决方案3】:
    awk '{print $1 $2}'
    

    这种情况下有解决办法吗

    【讨论】:

    • 不,不是。这将连接这些字段,并且不会解决 2 个打印件只是示例的 OPs 问题。
    【解决方案4】:

    TL;DR

    您收到换行符是因为print 在每个打印语句之后将 OFS 发送到标准输出。您可以通过多种其他方式格式化输出,但关键通常是只调用单个 printprintf 语句,无论您要打印多少字段或值。

    使用逗号

    执行此操作的一种方法是使用对print 的单个调用,使用逗号分隔参数。这将在打印的参数之间插入 OFS。例如:

    $ echo '1 2' | awk '{print $1, $2}'
    1 2
    

    不要分开参数

    如果您不想在输出中进行 任何 分隔,只需将所有参数传递给单个 print 语句。例如:

    $ echo '1 2' | awk '{print $1 $2}' 
    12
    

    格式化字符串

    如果您想要更多的控制权,请使用带有printf 的格式化字符串。例如:

    $ echo '1 2' | awk '{printf "%s...%s\n", $1, $2}' 
    1...2
    

    【讨论】:

      【解决方案5】:
      $ echo "1 2" | awk '{print $1 " " $2}'
      1 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        • 2011-07-10
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多