Shell awk命令中的For循环
我有一个包含行的文件,现在我想从Unix中的awk命令中读取它的w值。我能够读取该文件,但是我添加了一个for循环来遍历文件中的所有数据。但我的for循环并没有结束,而是在无限循环中进行。 下面是我用来读取文件并获取$1、$2和$3位置数据的代码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
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”,因此该语句将针对第二个文件的每一行运行
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"