【问题标题】:AWK - how to improve this example?AWK - 如何改进这个例子?
【发布时间】:2012-04-22 19:08:43
【问题描述】:

我有一个文件:

AA
BB

这个命令打印出来:

$ awk 'BEGIN { system("awk '"'"'{print}'"'"' file") }'

AA
BB

相同,但在'printf'中:

$ awk 'BEGIN { system("awk '"'"'{printf "%s ", $0}'"'"' file") }'

/bin/sh: Illegal option -,

如何改进最后一条命令得到结果:

AA BB

感谢您的帮助。

【问题讨论】:

    标签: awk


    【解决方案1】:

    希望您的问题只是出于好奇。毫无疑问,有更好的方法来完成您可能尝试做的任何事情。

    与其尝试使用打开和关闭单引号和双引号的复杂序列(如果它们没有正确配对可能会产生奇怪的副作用),您可以使用变量来表示引号。通过本质上是三级引用,它使代码更易于阅读。下面的技术有点类似于 Perl 的 q() 引用。

    将变量q 设置为相当于单引号的八进制,然后你可以这样做:

    awk 'BEGIN{q = "\047"; system("awk " q "{print}" q " file")}'
    

    间距由您决定 - 每个字符串段连接到其相邻段。

    这是另一种您可能会发现更具可读性的方式:

    awk 'BEGIN{q = "\047"; system("awk " q"{print}"q " file")}'
    

    【讨论】:

    • 我只是出于好奇而询问解决方案。我知道有更好的方法来解决这个问题。谢谢你的信息。
    【解决方案2】:

    这可能对你有用:

    awk 'BEGIN{system("awk '\''{printf \"%s \", $0} END { print \"\" }'\'' file")}'
    AA BB 
    

    或更容易:

    awk 'BEGIN{system("paste -sd\" \" file")}'
    AA BB
    

    【讨论】:

      【解决方案3】:

      简单,不要使用awk;使用tr

      tr '\n' ' ' file; echo;  
      

      或者,如果您在一个管道中需要所有这些

      tr '\n' ' ' file | awk 'END { print }'
      

      【讨论】:

      • 谢谢,但它走的不是我。我想使用这个命令:awk 'BEGIN { system("awk '"'"'{printf "%s ", $0} END { print "" }'"'"' file") }'
      • @Tedee12345 你为什么要做那些毫无意义的系统废话?
      • 我想使用 system() 有两个原因。 1. 用于教育。 2. 我想在我的函数中使用 system()。
      • @Tedee12345 这不是一个适合system 的函数。 1. 它教给你一个不好的做法,使它与教育背道而驰。 2. 你“想要”不必要的复杂性?
      • 我只是出于好奇而询问解决方案。我知道有更好的方法来解决这个问题。
      【解决方案4】:

      如果你想纯粹在 awk 中做,你可以尝试这样的事情:

      awk '{printf "%s ", $0} END { print "" }'  <  aabb.txt
      

      【讨论】:

      • 谢谢,但它走的不是我。我想使用这个命令:awk 'BEGIN { system("awk '"'"'{printf "%s ", $0} END { print "" }'"'"' file") }'
      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 2012-06-02
      • 2014-08-12
      • 1970-01-01
      • 2011-10-16
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多