我有一个有行的文件,现在我想从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;
答案 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脚本当然可以压缩成一行,我将它分开以便于阅读。
另请注意,这种保持或显示行数的方法可能有点沉重。如果您知道自己只显示了行数,则可以使用内部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"