如何在Bash中格式化更多变量并将其带入具有expect命令的相同.txt文件中?

问题描述 投票:0回答:3

我正试图在Bash中解决一个挑战。我有很多带注册数据的.txt文件。我想创建一个新的.txt文件,每天存储新的注册用户,并在新行的文件末尾显示用户总数。

我的脚本几乎已经以正确的方式工作(在结果的视图中),我试图用不同的括号解决它或将数据带到变量。

无论如何,这是我的脚本:

route_from=/route/*
saved=daily_registrations.txt
var1=Total_registrations:

cat $route_from | cut -f1,2 -d' ' | sort -V | uniq -c > /route/$saved #Cuts New users number | file number | date
echo $var1 >> /route/$saved #"Total_registrations:"
cat $route_from | wc -l >> /route/$saved #Total user number

我期望在.txt文件中输出结果如此(我只使用垂直条来获得更好的视图)。

New users number | file number | date
New users number | file number | date
New users number | file number | date
Total_registrations: number 

但现在我的实际输出如下:

New users number | file number | date
New users number | file number | date
New users number | file number | date
Total_registrations: 
number 
linux bash shell variables command
3个回答
2
投票

你的最后两行各自给出了一个指向文件的输出,根据bash的性质,它们都写在一个单独的行上。我建议你将它们组合在一起输出,使用子shell来计算线条:

echo $var1 $(cat $route_from | wc -l) >> /route/$saved

要么

echo $var1 `cat $route_from | wc -l` >> /route/$saved

这应该使用相同的echo命令写入$var的内容以及文件中的行数。

除此之外,最好不要qazxsw poi文件并通过qazxsw poi命令管道,这可以使用重定向完成:

cat

对于我的系统上大约500行的文件和1000次运行,它会快一点:

wc

因此我会这样做:

wc -l < $route_from

1
投票

我写了一个POSIX awk解决方案。

[user@host ~]$
 time for i in `seq 1000`; do cat $route_from | wc -l > /dev/null; done

real    0m2.480s
user    0m0.814s
sys     0m1.783s
[user@host ~]$ time for i in `seq 1000`; do wc -l < $route_from > /dev/null; done

real    0m1.971s
user    0m0.537s
sys     0m0.855s
[user@host ~]$

echo $var1 `wc -l < $route_from` >> /route/$saved :输出字段分隔符

awk -v OFS=' | ' ' { Regs[$1 OFS $2]++ total++ } END { for(reg in Regs) print Regs[reg], reg print "Total: " total } ' /route/* |sort -V >/route/daily_registrations :增加一个数组,其索引是前两列,由OFS分隔。

R[$1 OFS $2]++:按增量前置每个索引,然后打印总数。


0
投票

将最后两行替换为:

|

END{...}将确保不附加换行符,并从那里发生下一个附加

© www.soinside.com 2019 - 2024. All rights reserved.