对于awk命令中的循环

时间:2018-05-08 14:06:54

标签: shell unix awk

我有一个有行的文件,现在我想从Unix中的awk命令读取它的值。我能够读取该文件,但我添加了一个for循环来遍历所有数据到文件中。但是我的for循环没有结束,它将进入无限循环。 下面的代码我用来读取文件并获得$ 1,$ 2和$ 3位置的数据

file=$1;
nbrClients=`wc -l $file | cut -d' ' -f1`;
echo $nbrClients;
awk '{
    for(i=0; i<=$nbrClients; ++i)
    {print $1 $2 $3}
}' $file

我正在阅读的文件格式如下:

abc 12 test.txt
abc 12 test.txt
abc 12 test.txt
abc 12 test.txt
abc 12 test.txt
abc 12 test.txt

因此,对于这个nbrClients值将是6并且它应该循环6次但是它没有这样做。请指出我在做什么错误。

以下是我想要的完整代码:

file=$1;
nbrClients=`wc -l $file | cut -d' ' -f1`;
echo $nbrClients;
file=$1;
cat | awk '{
 fileName=$1
 tnxCount=$2
 for i in `seq 1 $tnxCount`
 do
   echo "Starting thread number $i"
   nohup perl /home/user/abc.pl -i $fileName >>/home/user/test_load_${today}.out 2>&1 &
 done
}' $file;

2 个答案:

答案 0 :(得分:0)

根据评论和问题的最新版本更新答案

file=$1;
nbrClients=`wc -l $file | cut -d' ' -f1`;
echo $nbrClients;
file=$1;
cat $file | awk -v fileName="$1" -v tnxCount="$2" '{
   system("echo "Starting thread number $i"")
   system("nohup perl /home/user/abc.pl -i $fileName >>/home/user/test_load_${today}.out 2>&1 &")
}';

答案 1 :(得分:0)

我认为这里的问题是你的印象是for循环会导致awk逐步浏览你的输入文件,而awk的性质就是这样做了

Awk通过获取一组condition { statement }对,然后是FOR EACH LINE OF INPUT,评估条件,如果它成立,则执行语句。请注意,条件可以是语句(因为函数和其他命令具有返回值),语句可以包含if构造,因此这里有很多灵活性。

请注意,awk还可以减少或简化您在shell脚本中执行的操作。请考虑以下事项:

#!/bin/sh

file="$1"

awk '
  NR==FNR {
    ClientCount++
    next
  }
  FNR==1 {
    printf "%s: %d\n", FILENAME, ClientCount
  }
  {
    print $1, $2, $3
  }
' "$file" "$file"

此脚本读取输入文件两次 - 一次计算行数(以便行数可以放在输出的顶部),一次处理行,打印前三个字段。该脚本由三个condition { statement }分组组成:

  • 第一个是柜台。它仅在文件的第一个实例上运行,next命令确保不会在该文件上运行其他命令。
  • 第二个操作在文件的第一行。但是由于第一个条件捕获了所有第一个文件,因此当第二个文件的第一行处于播放状态时,此语句只会执行一次。
  • 第三个是打印大部分输出的内容。使用awk时,如果不包含条件,则假定条件为&#34; true&#34;,因此该语句针对第二个文件的每一行运行。

awk脚本当然可以压缩成一行,我将它分开以便于阅读。

另请注意,这种保持或显示行数的方法可能有点沉重。如果您知道自己只显示了行数,则可以使用内部awk变量NR。在脚本中评估第二个条件的位置,NR-1是上一个文件的行数,因此您可以使用:

#!/bin/sh

file="$1"

awk '
  NR==FNR {
    next
  }
  FNR==1 {
    printf "%s: %d\n", FILENAME, NR-1
  }
  {
    print $1, $2, $3
  }
' "$file" "$file"