我不知道如何在nawk命令中实现函数调用。我在输入和输出中给出了我想要的范围。函数应该验证第3列,并返回true或false。如果列满足条件,则应该转到好文件;如果不是,则转到坏文件。您能帮我修改nawk命令以实现我的功能吗?
我知道我们可以在单个语句中实现长度验证,但我的验证函数只是示例代码。我希望在验证函数中实现更多的长度检查。
input.txt
1 | I | 123 | KK
3 | U | 3456 | JJ
6 | B | 241 | YHoutputgood.txt
3 | U | 3456 | JJoutputbad.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发布于 2014-03-30 20:01:53
首先,您有一个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中使用更少的代码来完成这个任务,但是您的问题只是指定了"shell“,所以我假设是/bin/sh。
发布于 2014-03-30 19:07:25
如果这是您读取的数据,则在管道上拆分将在字段的值中留下空白。另外,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.txthttps://stackoverflow.com/questions/22748197
复制相似问题