Cshell和Awk无限运行

时间:2013-07-10 18:45:34

标签: unix putty rc-shell

当我运行以下程序时,我得不到回复,但是程序仍然会一直运行直到我结束它。请问有人可以告诉我为什么会这样。我试图让这个复杂的awk语句起作用,但是,它已经非常不成功了。

我用于我的Cshell的代码是(它全部在一行,但我把它拆分到这里以便于阅读):

awk '{split($2,b,""); counter = 1; while (counter < 13)
{if (b[counter] == 1 && "'$cmonth'" > counter)
{{printf("%s%s%s\n", $1, "'$letter'","'$year3'")}; counter++; 
else if (b[counter] == 1 && "'$cmonth'" <= counter) 
{{printf("%s%s%s\n", $1, "'$letter'","'$year2'")}; counter++;} 
else echo "fail"}}' fileRead >> $year$month

我正在阅读的文本文件看起来像

fff 101010101010
yyy 100100100100

$ year2和$ year3代表从1987年开始的计数器,每行读取时间为1年 $ cmonth只是1-12个月的柜台 $ letter只是一个ID

如果字节代码中的位置为1,程序的目标是读取每一行并打印出ID,月和年。

1 个答案:

答案 0 :(得分:1)

你有一些不匹配的花括号,我已经重新格式化为一种缩进标准。

awk '{ \
     split($2,b,""); counter = 1 \
     while (counter < 13) { \
         if (b[counter] == 1 && "'$cmonth'" > counter){ \
             printf("%s%s%s\n", $1, "'$letter'","'$year3'") \
             counter++ \
         } \
         else if (b[counter] == 1 && "'$cmonth'" <= counter) { \
             printf("%s%s%s\n", $1, "'$letter'","'$year2'") \
             counter++ \
         } \
         else print "fail" \
     }  # while \
}' fileRead >> $year$month

awk也不支持echo

确保\是该行的最后一个字符(没有空格或制表符!!!),否则您将收到语法错误。

否则,您可以将所有行“折叠”成一行。偶尔添加';'根据需要。

修改

或者你可以使用这个awk脚本的先前版本(没有\行继续字符),把它放在一个文件中(没有' ....'之外的任何元素(单引号)并将其作为文件从awk中调用。您还需要这样做,以便传递变量cmonth,letter,year2以及我错过的任何其他变量。

  1. 另存为文件
  2. 编辑文件,删除所有'\'字符,将所有变量如“'$ letter'”更改为字母**
  3. 调用程序,如
  4. **

     awk -v letter="$letter" -v year2="$year2" -v month="$month" -f myScript  fileRead >> $year$month
    

    **

    例如

     printf("%s%s%s\n", $1, "'$letter'","'$year2'")
    

    变为

    printf("%s%s%s\n", $1, letter,year2)
    

    IHTH。