我正试图在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
你的最后两行各自给出了一个指向文件的输出,根据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
我写了一个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]++
:按增量前置每个索引,然后打印总数。
将最后两行替换为:
|
END{...}
将确保不附加换行符,并从那里发生下一个附加