Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell awk命令中的For循环_Shell_Unix_Awk - Fatal编程技术网

Shell awk命令中的For循环

Shell awk命令中的For循环,shell,unix,awk,Shell,Unix,Awk,我有一个包含行的文件,现在我想从Unix中的awk命令中读取它的w值。我能够读取该文件,但是我添加了一个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

我有一个包含行的文件,现在我想从Unix中的awk命令中读取它的w值。我能够读取该文件,但是我添加了一个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
因此,对于这个值将是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;

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

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 &")
}';

我认为这里的问题是,您的印象是for循环会导致awk逐步遍历您的输入文件,而awk的本性是已经这样做了

Awk的工作原理是获取一组
条件{statement}
对,然后对每一行输入计算条件,如果条件为真,则执行语句。请注意,条件可以是语句(因为函数和其他命令都有返回值),语句可以包含
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"
此脚本将读取输入文件两次——一次用于计算行数(以便将行数放在输出的顶部),一次用于处理行,打印前三个字段。脚本由三个
条件{statement}
分组组成:

  • 第一个是柜台。它只在文件的第一个实例上运行,并且
    next
    命令确保不会在该文件上运行其他命令
  • 第二个在文件的第一行操作。但由于第一个条件捕获了第一个文件的所有内容,因此当第二个文件的第一行正在运行时,该语句只执行一次
  • 第三个是打印大部分输出的内容。对于awk,如果不包含任何条件,则假定该条件为“true”,因此该语句将针对第二个文件的每一行运行
当然,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"

shell变量不会在单引号
“…”
中使用
for
循环展开,但打印硬编码的值,如
$1、$2、$3
没有任何意义。或者您将打印每行的前三个字段,如
print$1、$2、$3
,或者对于每行,您将使用
print$i
@Developer打印
nbr
字段。您的更新毫无意义,与您前面问题中的示例代码几乎没有相似之处。看起来您在awk脚本中有shell代码,这显然无法工作。为什么awk是这个问题的一部分?@ghoti我认为awk将是读取文件的好选择,然后我们可以根据从awk命令接收到的数据调用perl脚本当然,您可以用awk完成所有输入处理。或者在贝壳里。或者使用perl。如果存在最终需要运行的现有代码,那么您可以避免语言混合,只需将所需的一切添加到perl脚本中。我希望for循环只运行6次,但从这一点来看,它每行运行6次。这应该可以完成任务
awk'{print$1”“$2”“$3}“$1
但是$1会一次给我所有的值,我的问题是我想逐个遍历每一行,然后使用awk打印$1$2值。awk会自动逐行遍历,然后打印$1和$2。我已经更新了答案。检查这是否对您没有帮助?我认为awk将是读取文件的好选项,然后我们可以根据从awk命令接收到的数据调用perl脚本。
#!/bin/sh

file="$1"

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