如果满足某些条件,则从记录中删除某个字段

时间:2014-03-26 00:37:21

标签: awk

我想使用awk执行以下操作:

输入:

0 foo foo dsag
1 foo foo dag
2 foo foo
3 asdg foo foo
4 foo gef foo
asgd 5 foo foo

输出:

0 foo foo
1 foo foo
2 foo foo
3 foo foo
4 foo foo
5 foo foo

基本上,我使用OCR从pdf解析数据,并且有一些随机的东西。所以我需要完全删除这些字段。我知道condition来测试是否需要移除一个字段,但下一步是什么?

我只能想到使用for循环这样做:

for(i=1;i<=NF;i++) {
   if(condition holds) {
        printf("%s",$i);
   }
   print;
}

但是有内置功能吗?

无意义字段不会出现在每一行中,也不会出现在同一个地方。

1 个答案:

答案 0 :(得分:0)

使用不是一个而是两个内置函数:

awk '{gsub(FS"[dag][[:alpha:]]*",""); sub("^""[dag][[:alpha:]]*"FS,"")}1' data

我认为在带有函数和注释的可执行awk文件中进行描述是最简单的。还添加了一个额外条件(NF > 3)来决定何时删除额外字段:

#!/usr/bin/awk -f

function stripFieldsMatching( pattern ) {
    gsub( FS pattern, "" )    # remove all patterns in fields 2-NF
    sub( "^" pattern FS, "" ) # lastly, remove any leading pattern
}

NF > 3 {stripFieldsMatching( "[dag][[:alpha:]]*" )}
1

显然,需要更改模式以匹配您的数据,并且您可能有超过3个字段。 gsubsub正在$0上运行,因此每条修改过的行都可以在末尾打印条件1以及每条未更改的行。