我一直在 Red Hat 服务器上运行下面的脚本,它工作正常并完成了工作。我正在提供的文件包含半百万行(大约 500000 行),这就是为什么(为了更快地完成它)我在 while 循环块的末尾添加了一个“&”
但是现在我已经设置了一个运行 Ubuntu 18.04 的 8 GB RAM 的桌面,并且运行相同的代码只完成了几千行然后挂起。我读了一些关于它的内容并将堆栈限制也增加到了无限制,但它仍然在 80000 行左右后挂起,关于如何优化代码或调整我的 PC 参数以始终完成工作的任何建议?
while read -r CID60
do
{
OLT=$(echo "$CID60" | cut -d"|" -f5)
ONID=${OLT}:$(echo "$CID60" | cut -d, -f2 | sed 's/ //g ; s/).*|//')
echo $ONID,$(echo "$CID60" | cut -d"|" -f3) >> $localpath/CID_$logfile.csv
} &
done < $localpath/$CID7360
输入:
202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ASSN45| Unlocked|12-654-0330|Up|202-00_MSRFKH00OL6|P282018767.C2028 ( network, R1.S1.LT7.PON8.ONT81.SERV1 )|
202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ASSN46| Unlocked|12-654-0330|Down|202-00_MSRFKH00OL6|P282017856.C881 ( local, R1.S1.LT7.PON8.ONT81.C1.P1 )|
202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ASSN52| Unlocked|12-664-1186|Up|202-00_MSRFKH00OL6|P282012623.C2028 ( network, R1.S1.LT7.PON8.ONT75.SERV1 )|
输出:
202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT81.SERV1,12-654-0330
202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT81.C1.P1,12-654-0330
202-00_MSRFKH00OL6:R1.S1.LT7.PON8.ONT75.SERV1,12-664-1186
我感兴趣的输出是第 5 列(用管道分隔|
)与最后一列的一部分连接,然后是第三列
纯 sed 解决方案:
-k
保持顺序,所以输入的第一/最后一行也将是输出的第一/最后一行--pipepart
即时拆分文件--block -1
每个 CPU 线程分成 1 个块-a input.txt
要拆分的文件doit
要调用的命令(或 bash 函数)Speedwise
parallel
(黄色)版本tr
在我的系统上优于(黑色)大约 200 MB(秒 vs MB):我和其他人的oneliners以及一些测试过的脚本
如果项目和分隔符的顺序可能与您在问题中指定的不同,我认为下面的单行会做到这一点,
但是在您写的评论中,您需要完全指定的格式。
我添加了一个带有'awk'的解决方案,这与 PerlDuck 的带有
perl
. 请参阅此答案的结尾。oneliners和小脚本的测试
测试是在我的计算机上使用 Lubuntu 18.04.1 LTS、2*2 处理器和 4 GiB RAM 完成的。
我
infile
从您的演示(1572864 行)中“加倍 20 倍”,因此获得了巨大的input
收益,因此您的 500000 行有一些余量,Oneliner
cut
和sed
:定时
我们可能会期望,纯
sed
解决方案会更快,但我认为数据的重新排序会减慢速度,因此cut
解决sed
方案会更快。这两种解决方案都可以在我的计算机上正常工作。Oneliner
cut
和sed
:xenoid的纯
sed
oneliner:python
xeniod 使用具有非贪婪匹配的正则表达式的脚本:PerlDuck的
perl
oneliner 比以前的 oneliner 更快:tr
带有和cut
带有命令的Onelinertr -s
:我曾经
tr
将输入文件中的空格转换为管道字符,然后cut
可以在没有sed
. 如您所见,tr
比 快得多sed
。该tr -s
命令删除输入中的双管道,这是一个好主意,特别是如果输入文件中可能存在重复的空格或管道。它的成本并不高。tr
带和cut
不带命令的Oneliner,tr -s
迄今为止最快:Oneliner 具有
awk
, 快但不是最快的,awk
根据parallel
Ole Tange 实施,将实时时间从 5s 减少到 2s:parallel
正如 Ola Tange 对此问题的回答中的图表所描述的那样,我们可以预期随着输入文件的大小增大,优势会增加。速度总结:根据
time
四舍五入到小数点后的“真实”时间最后,我注意到带有
sed
,python
,perl
,awk
和 {parallel
&awk
} 的单行代码创建了一个具有规定格式的输出文件。Perl 解决方案
该脚本不会并行执行任何操作,但无论如何都非常快。将其另存为
filter.pl
(或您喜欢的任何名称)并使其可执行。我复制了您的示例数据,直到获得 1,572,864 行,然后按如下方式运行:
如果您更喜欢单线,请执行以下操作:
Python
(适用于 Python2 和 Python3)
使用具有非贪婪匹配的正则表达式快 4 倍(避免回溯?),并使 python 与 cut/sed 方法相提并论(python2 比 python3 快一点)