我不确定如何在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
答案 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
。