首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nawk命令中的函数调用

Nawk命令中的函数调用
EN

Stack Overflow用户
提问于 2014-03-30 18:43:28
回答 2查看 207关注 0票数 1

我不知道如何在nawk命令中实现函数调用。我在输入和输出中给出了我想要的范围。函数应该验证第3列,并返回true或false。如果列满足条件,则应该转到好文件;如果不是,则转到坏文件。您能帮我修改nawk命令以实现我的功能吗?

我知道我们可以在单个语句中实现长度验证,但我的验证函数只是示例代码。我希望在验证函数中实现更多的长度检查。

input.txt

代码语言:javascript
复制
1 | I | 123  | KK
3 | U | 3456 | JJ
6 | B | 241  | YH

outputgood.txt

代码语言:javascript
复制
3 | U | 3456 | JJ

outputbad.txt

代码语言:javascript
复制
1 | I | 123  | KK
6 | B | 241  | YH

剧本:

代码语言:javascript
复制
#!/bin/sh
#function validation

function validate(){
in = $1
if length(in) > 3
  return true
else
 return false
}

nawk -F '|' 'function validate($3){print}' input.txt > outputgood.txt
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-30 20:01:53

首先,您有一个shell函数,您正在尝试从您的awk脚本中调用它。那是行不通的。

如果您的验证必须在shell中,那么也许您可以在shell中完成整个过程。

代码语言:javascript
复制
#!/bin/sh

while read line; do

  var=${line#* | }                              # take off first field
  var=${var#* | }                               # take off second field
  var=${var% | *}                               # take off fourth field
  var=`expr "$var" : "^\ *\(.*[^ ]\)\ *$"`      # trim whitespace

  if [ ${#var} -gt 3 ]; then
    echo "$line" >> outputgood.txt
  else
    echo "$line" >> outputbad.txt
  fi

done < input.txt

我们使用参数工具分割行,因为$IFS不允许我们使用可变数量的空格。您还可以使用位置参数来完成这一任务,这也可能使您更容易访问其他字段。请注意,如果您使用字段长度作为条件,则仍然需要修剪。

代码语言:javascript
复制
#!/bin/sh

IFS="|"
while read line; do

  set -- $line
  var=`expr "$3" : "^\ *\(.*[^ ]\)\ *$"`        # trim whitespace

  if [ ${#var} -gt 3 ]; then
    echo "$line" >> outputgood.txt
  else
    echo "$line" >> outputbad.txt
  fi

done < input.txt

如果您真正感兴趣的是第三个字段是否大于1000,那么测试它比测试字段的长度更好。编程的清晰度就像其他任何东西的清晰度一样。如果你能避免的话,不要混淆。

请注意,我们可以在bash中使用更少的代码来完成这个任务,但是您的问题只是指定了"shell“,所以我假设是/bin/sh

票数 0
EN

Stack Overflow用户

发布于 2014-03-30 19:07:25

如果这是您读取的数据,则在管道上拆分将在字段的值中留下空白。另外,nawk函数实际上必须位于nawk脚本的主体中。

让我们试试这个:

代码语言:javascript
复制
nawk -F'[[:space:]]*\\\|[[:space:]]*' '
    function validate(in) {
        return (length(in) > 3)
    }
    {
        if (validate($3)) {
            print > "good"
        } else {
            print > "bad"
        }
    }
' input.txt

简单得多的是:

代码语言:javascript
复制
nawk -F '|' '{if ($3 > 1000) print > "good"; else print > "bad"}' input.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22748197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档