Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell Nawk命令中的函数调用_Shell_Unix_Nawk - Fatal编程技术网

Shell Nawk命令中的函数调用

Shell Nawk命令中的函数调用,shell,unix,nawk,Shell,Unix,Nawk,我不知道如何在nawk命令中实现函数调用。我已经从输入和输出中给出了我想要的范围。函数应该验证第3列并返回true或false。如果列满足条件,则它应进入良好文件;如果没有,则转到坏文件。你能帮我修改nawk命令来实现我的功能吗 我知道我们可以在单个语句中实现长度验证,但我的验证函数只是示例代码。我想在validate函数中实现更多长度检查 input.txt: outputgood.txt: outputbad.txt: 脚本: #!/bin/sh #function validation

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

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

input.txt:

outputgood.txt:

outputbad.txt:

脚本:

#!/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

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

让我们试试这个:

nawk -F'[[:space:]]*\\\|[[:space:]]*' '
    function validate(in) {
        return (length(in) > 3)
    }
    {
        if (validate($3)) {
            print > "good"
        } else {
            print > "bad"
        }
    }
' input.txt
更简单的是:

nawk -F '|' '{if ($3 > 1000) print > "good"; else print > "bad"}' input.txt

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

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

#!/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
如果您真正感兴趣的是第三个字段是否大于1000,那么这将是比字段长度更好的测试。编程的清晰性就像其他任何东西的清晰性一样。如果可以避免的话,不要混淆


请注意,我们可以在
bash
中使用更少的代码来实现这一点,但您的问题只是指定了“shell”因此,我假设
/bin/sh

我想将validate函数保留在nwak命令之外,原因是我的validate函数位于现有代码的25行中。我需要通过验证才能获得它。我只需要nwak命令就可以进行函数调用。你能在这方面提供帮助吗?从awk调用bash函数既笨拙又缓慢。你为什么要这样混合语言?你能使用bash或ksh吗?或者你只能使用/bin/sh吗?@user3470017:你可以在
awk
脚本中写几百行,尽管你通常最好将脚本保存在自己的源文件中,并使用
awk-F'|'-F script.awk文件…
来运行它。担心25行是愚蠢的;2500-是的,也许你会担心。
awk
不能真正调用shell函数,
length(in)
无论如何都是无效的shell语法。
nawk -F'[[:space:]]*\\\|[[:space:]]*' '
    function validate(in) {
        return (length(in) > 3)
    }
    {
        if (validate($3)) {
            print > "good"
        } else {
            print > "bad"
        }
    }
' input.txt
nawk -F '|' '{if ($3 > 1000) print > "good"; else print > "bad"}' input.txt
#!/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
#!/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