我想使用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;
}
但是有内置功能吗?
无意义字段不会出现在每一行中,也不会出现在同一个地方。
答案 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个字段。 gsub
和sub
正在$0
上运行,因此每条修改过的行都可以在末尾打印条件1
以及每条未更改的行。