Nawk命令中的函数调用

时间:2014-03-30 18:43:29

标签: shell unix nawk

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

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

input.txt中

1 | I | 123  | KK
3 | U | 3456 | JJ
6 | B | 241  | YH

outputgood.txt

3 | U | 3456 | JJ

outputbad.txt

1 | I | 123  | KK
6 | B | 241  | YH

脚本:

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

2 个答案:

答案 0 :(得分:1)

如果这是您的读取数据,拆分管道将在字段的值中留下空格。此外,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

答案 1 :(得分:0)

首先,您已经拥有了一个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

我们正在使用参数工具拆分该行,因为$IFS不允许我们使用可变数量的空格。您也可以使用位置参数来执行此操作,这样您也可以更轻松地访问其他字段。请注意,如果您使用字段长度作为条件,则仍需要修剪。

#!/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中的少量代码执行此操作,但您的问题只是指定了&#34; shell&#34;所以我假设/bin/sh