使用awk中的函数缩短代码

shortern code using function in awk

我当前的 awk 代码是这样的

awk -F" " '
function strcleaner(string)
{    
    gsub("oid=","",$string);
    gsub("ver=","",$string);
    gsub("vers=","",$string);
    gsub("type=","",$string);
    gsub(",","",$string);
    return $string;
}
BEGIN   { print "OID\tVersions\tObject Type" } 
    {           
        if ( !="Update:") {
            if( =="MainFullCourse:") {    
            gsub("oid=","",);
            gsub(",","",);
            gsub("ver=","",);
            gsub("vers=","",);
            gsub(",","",);
            gsub("type=","",);
            gsub(",","",);
            print  "\t"  "\t" 
            }               
        }
    }
END     { print " - DONE -" } 
' $detlogfile >> "./final.txt"

目前,我必须使用

手动清理$2、$3、$4
            gsub("oid=","",);
            gsub(",","",);
            gsub("ver=","",);
            gsub("vers=","",);
            gsub(",","",);
            gsub("type=","",);
            gsub(",","",);

是否可以制作一个 strcleaner 函数,所以我可以使用

print strcleaner() "\t" strcleaner() "\t" strcleaner()

示例输入

MainFullCourse: oid=13252254, vers=1, type=142, size=186

预期输出

13252251 1 142

非常感谢

如果我正确理解您的尝试,那么

awk -F" " '
  function strcleaner(string)
  {    
      # No $s here.
      gsub("oid=","",string);
      gsub("ver=","",string);
      gsub("vers=","",string);
      gsub("type=","",string);
      gsub(",","",string);
      return string;
  }
  BEGIN   { print "OID\tVersions\tObject Type" } 
   == "MainFullCourse:" {           
    print strcleaner() "\t" strcleaner() "\t" strcleaner()
  }               
  END     { print " - DONE -" } 
  ' $detlogfile >> "./final.txt"

$不是awk中一般的变量访问(只要变量名就可以),它是访问某个字段。您可以说 num = 1,然后 $num 将是第一个字段 ()。

你的做法完全错了。到目前为止,要执行您告诉我们的操作,您只需要:

$ awk -F'[:,=] *' '{print , , }' file
13252254 1 142

如果你想做一些额外的事情,你做事的方式也是错误的,因为这是做任何事情的错误方式。如果你想要帮助做任何事情,你正在尝试以正确的方式做事,post 一个新问题,附加 input/output 和描述。