【问题标题】:Is there a way to define a user-defined function inside an awk statement which is inside a bash script?有没有办法在 bash 脚本中的 awk 语句中定义用户定义的函数?
【发布时间】:2014-09-13 19:24:48
【问题描述】:

我认为这个问题不言自明。我是初学者,所以请让我知道这是否可能。如果没有,请给我一个更好的解决方案,因为我的 bash 脚本严重依赖于某些 awk 语句,但大部分脚本都在 bash 中。我在我的 bash 脚本中使用 awk 语句比较两个文件。基本上检查值是否相同。 (参见下面的文件)

file1.txt

Name  Col1  Col2  Col3 
-----------------------
row1  1     4     7         
row2  2     5     8          
row3  3     6     9

file2.txt

Name  Col1  Col2  Col3   
-----------------------         
row1  1     4     7 
row2  2     5     999

这是我的 bash 脚本的结构:

#!/bin/bash
.
.
.

awk -F '\t' '
              # skips first two lines
              FNR < 2 {next}                       
              FNR == NR {           
                for (i = 2; i <= NF; i++) {
                  a[i,$1] = $i;      
                }    
                b[$1];           
                next;       
              }

              ($1 in b) {                          

                for (i = 2; i <= NF; i++) 
                {
                   # does something
                }
              }
' file1.txt file2.txt
.
.
.

我有很多只在awk 语句中有用的重复代码,所以我想创建一个函数,将其放置在awk 语句中以避免重复。这可能吗?

如果需要进一步解释,请告诉我。

【问题讨论】:

    标签: linux bash shell awk scripting


    【解决方案1】:

    当然,只需定义函数:

    awk '
    function foo() {
       print "Hello World"
    }
    BEGIN {
        foo()
        foo()
    }
    '
    

    【讨论】:

      【解决方案2】:

      如果您询问如何在多个脚本中重用一段 Awk 代码而不将其保存在单独的文件中,您可以定义一个 shell 字符串并对其进行插值。

      awkfn='function foo () { print "Hiya universe" }'
      
      awk -F : "$awkfn"'BEGIN { foo() }'
      

      请注意,要插入的变量需要双引号,但通常需要在 Awk 代码周围加上单引号。我将一个双引号字符串紧挨着一个单引号字符串(它们之间没有空格),但是还有其他方法可以完成同样的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-02
        相关资源
        最近更新 更多