1

当我运行下面的程序时,我没有得到任何回报,但是程序仍然会永远运行,直到我结束它。有人可以向我解释为什么会发生这种情况。我试图让这个复杂的 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

这里代表从 1987$year2$year3开始的计数器,每读取一行就增加 1 年。 $cmonth只是从 1 到 12 的月份计数器。 $letter只是一个ID。

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

4

1 回答 1

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. 调用程序如

**

 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。

于 2013-07-10T19:01:08.840 回答