【问题标题】:skips the first line of input argument跳过输入参数的第一行
【发布时间】:2025-12-31 04:25:06
【问题描述】:
read                          #reads input 
awk 'BEGIN {FS=";"}           #file seperator=;
{
    c=0;
    if($2=="programmer"||$2=="Programmer"||$2="PROGRAMMER")   #checks if the person is a programmer
    {
        print $1","$2","$3","$3*12;
        c=c+1;
    }
}
END {
    if(c==0)
    {
        print "no programmer";
    }
}'

当我执行这个脚本时,它总是跳过读取输入参数的第一行并继续读取第二行。

【问题讨论】:

  • 提供演示问题的示例输入。还要仔细检查您对=== 的使用。

标签: shell awk scripting


【解决方案1】:

你没有提到任何变量,它会包含用户作为读取命令的一部分输入的值,提到一个变量并将它传递给 awk 命令,那么它应该会飞。

read var                         #reads input

echo "$var" |
awk 'BEGIN {FS=";"}              #file separator=;
{
    c=0;
    if($2=="programmer"||$2=="Programmer"||$2=="PROGRAMMER")   #checks if the person is a programmer
    {
        print $1","$2","$3","$3*12;
        c=c+1;
    }
}
END {
    if(c==0)
    {
        print "no programmer";
    }
}'

另外(Shawn 在问题部分的 cmets 中提到的内容),您需要将 = 更改为 == 以使其在您的 $2=="PROGRAMMER" 部分中处于正确状态。

如果用户可以输入超过上述三种类型(程序员的值),您实际上可以这样做,在上面的代码中将您的 if 条件更改为if(tolower($2)=="programmer")

【讨论】:

  • 我按照你说的做了,我的脚本只打印输入参数的第一行。
  • @YashwanthY,答案是根据您显示的问题给出的,因为它不清楚您的示例输入和预期的示例输出是什么我不能真正说出它为什么不运行,基本上我已经拿走了你的仅代码:)
  • 输入:yashwanth;programmer;50000 #newline vishal;tech_support;40000 #newline avinash;Programmer;70000 输出:yashwanth,programmer,50000,600000 #newline avinash,Programmer,840000
【解决方案2】:

第一组语句对每个输入行执行,这意味着在每个输入行中,变量c 将被重置为零。在计算 END 子句时,c 包含最后一行的值。

我会将初始化 c=0 移动到 BEGIN 子句中。

【讨论】:

  • 肯定的朋友