使用awk中的函数缩短代码

时间:2015-01-10 02:27:29

标签: string function replace 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 ($1 !="Update:") {
            if($1 =="MainFullCourse:") {    
            gsub("oid=","",$2);
            gsub(",","",$2);
            gsub("ver=","",$3);
            gsub("vers=","",$3);
            gsub(",","",$3);
            gsub("type=","",$4);
            gsub(",","",$4);
            print $2 "\t" $3 "\t" $4
            }               
        }
    }
END     { print " - DONE -" } 
' $detlogfile >> "./final.txt"

目前,我必须使用

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

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

print strcleaner($2) "\t" strcleaner($3) "\t" strcleaner($4)

示例输入

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

预期产出

13252251 1 142

非常感谢

2 个答案:

答案 0 :(得分:0)

如果我了解您正确尝试的内容,那么

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" } 
  $1 == "MainFullCourse:" {           
    print strcleaner($2) "\t" strcleaner($3) "\t" strcleaner($4)
  }               
  END     { print " - DONE -" } 
  ' $detlogfile >> "./final.txt"

$不适用于awk中的常规变量访问(只是变量名称就足够了),它可以访问某个字段。您可以说num = 1,然后$num将是第一个字段($1)。

答案 1 :(得分:0)

你真的错了。要做到目前为止你告诉我们的所有你需要的是:

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

如果你想做一些额外的事情,你做这件事的方式也是错误的,因为这是做错事的错误方法。如果您想帮助做任何事情,那么您正在尝试以正确的方式行事,发布一个带有额外输入/输出和描述的新问题。