有没有办法在awk语句中定义一个用户定义的函数,该语句位于bash脚本中?

时间:2014-07-22 19:44:21

标签: linux bash shell awk scripting

我认为这个问题不言而喻。我是初学者,所以如果可能,请告诉我。如果没有,那么你给我一个更好的解决方案,因为我的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语句中的函数,以避免重复。这可能吗?

如果需要进一步说明,请与我们联系。

2 个答案:

答案 0 :(得分:6)

当然,只需定义功能:

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

答案 1 :(得分:3)

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

awkfn='function foo () { print "Hiya universe" }'

awk -F : "$awkfn"'BEGIN { foo() }'

注意你需要如何插入变量的双引号,但通常需要围绕Awk代码的单引号。我在一个单引号字符串旁边放了一个带双引号的字符串(它们之间没有空格)但是还有其他方法可以完成同样的事情。