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