student文档里面内容如下:
jk,man,24,1361620
spl,woman,24,1386242
argv.argc文档里面内容如下:
#!/usr/bin/awk -f
BEGIN {
FS=",";
for(i=0;i<ARGC;i++){
print ARGV
}
if(ARGC>2){
print "hello world"
name=ARGV[2]
}
else{
print "Please input name:"
getline name< "-"
}
}
{
if(name ~ $1){
print $1,$4
}
else{
print "no this people"
}
}
当我输入 ./argv.argc student jk时,结果应该只输出:
awk
student
jk
hello world
jk 1361620
但为什么实际结果输出多了else里面语句:
awk
student
jk
hello world
jk 1361620
no this people
谢谢你指点下。
问一个awk中的if和else问题,想了很久,看了很久,还是不太明白
-
- 帖子: 2
- 注册时间: 2010-08-03 9:11
- 我就是我2
- 帖子: 1215
- 注册时间: 2008-12-13 10:55
- 来自: the Earth
- 联系:
Re: 问一个awk中的if和else问题,想了很久,看了很久,还是不太明白
不管你是./foo student spl 还是./foo student jk
总有一个不匹配的.前面的输入中,no...在前,后面的no...在后.
awk要处理每一行.
可以改变name的值来测试结果.
awk 默认处理每一行,
依照你的那个程序,想做的是这样.
若匹配 1行/n行的第一域, 打印匹配行指定域内容.
若搜索遍所有行的第一域都不匹配,则打印错误信息.
但是你后面的那个if else达不到这个目的.
总有一个不匹配的.前面的输入中,no...在前,后面的no...在后.
awk要处理每一行.
可以改变name的值来测试结果.
代码: 全选
name=ll;awk -F',' '{ if($1=="'"$name"'") {print $1,$4} else {print "error"} }' student
依照你的那个程序,想做的是这样.
若匹配 1行/n行的第一域, 打印匹配行指定域内容.
若搜索遍所有行的第一域都不匹配,则打印错误信息.
但是你后面的那个if else达不到这个目的.
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”
自然灋則
dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”
自然灋則
dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
- 我就是我2
- 帖子: 1215
- 注册时间: 2008-12-13 10:55
- 来自: the Earth
- 联系:
Re: 问一个awk中的if和else问题,想了很久,看了很久,还是不太明白
我现在不懂awk的高级用法.只能用用shell先了.
[bash]#!/bin/bash
# 文件名foo
filename=$1
name=$2
if [ $# -lt 2 ];then
read -p "input name:" name
fi
awk -F',' '{print $1}' $filename | grep "^$name$">/dev/null
if [ $? -eq 0 ];then
awk -F',' '($1=="'"$name"'"){print $1,$4}' $filename
else
echo "there's no $name in file $filename"
fi
[/bash]
输出结果
jk 1361620
spl 1386242
there's no ll in file student
[bash]#!/bin/bash
# 文件名foo
filename=$1
name=$2
if [ $# -lt 2 ];then
read -p "input name:" name
fi
awk -F',' '{print $1}' $filename | grep "^$name$">/dev/null
if [ $? -eq 0 ];then
awk -F',' '($1=="'"$name"'"){print $1,$4}' $filename
else
echo "there's no $name in file $filename"
fi
[/bash]
代码: 全选
for i in {jk,spl,ll};do ./foo student $i;done
jk 1361620
spl 1386242
there's no ll in file student
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”
自然灋則
dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”
自然灋則
dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
-
- 帖子: 2
- 注册时间: 2010-08-03 9:11
-
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
- 联系:
Re: 问一个awk中的if和else问题,想了很久,看了很久,还是不太明白
先说下,你把代码放code里看的多清楚阿。
你的代码里,下面这段方在了awk的BEGIN block里,而且后面没改那么name就定死了。然后你用这个去匹配文件里的每一行,结果就是所有name不是你给定的那个值的行,都会打印一遍no this person.。
解决这个可以考虑不用
而是把匹配到的记录先不打印,先保存起来,最后在END里,看保存的记录,如果有记录就打印,没有就打印no this person
你的代码里,下面这段方在了awk的BEGIN block里,而且后面没改那么name就定死了。然后你用这个去匹配文件里的每一行,结果就是所有name不是你给定的那个值的行,都会打印一遍no this person.。
代码: 全选
if(ARGC>2){
print "hello world"
name=ARGV[2]
}
else{
print "Please input name:"
getline name< "-"
}
代码: 全选
else{
print "no this people"
}
---
regards,
Kent
regards,
Kent
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 问一个awk中的if和else问题,想了很久,看了很久,还是不太明白
./argv.argc student jk
#awk 把参数当文件处理,读完student就会尝试读jk,也要解决。
#awk 把参数当文件处理,读完student就会尝试读jk,也要解决。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。