提高删除窗口行结尾的Bash循环的性能

jus*_*guy 1 linux bash performance sed gawk

编者注:这个问题总是关于循环性能,但最初的标题导致一些回答者 - 和选民 - 相信它是关于如何删除Windows行结尾.

下面的bash循环只是删除windows行结尾并将它们转换为unix并且似乎正在运行,但它很慢.输入文件很小(4个文件,范围从167字节 - 1 kb),并且都是相同的结构(名称列表),唯一不同的是长度(即一些文件是10个名称,其他文件是50).是否需要花费超过15分钟才能使用至强处理器完成此任务?谢谢 :)

for f in /home/cmccabe/Desktop/files/*.txt ; do
 bname=`basename $f`
 pref=${bname%%.txt}
sed 's/\r//' $f - $f > /home/cmccabe/Desktop/files/${pref}_unix.txt
done
Run Code Online (Sandbox Code Playgroud)

输入.txt文件

AP3B1
BRCA2
BRIP1
CBL
CTC1
Run Code Online (Sandbox Code Playgroud)

编辑

这不是重复,因为我更多地要求为什么我用于删除Windows行结尾的bash循环sed运行得如此之慢.我不是故意暗示如何删除它们,是在寻求可能加速循环的想法,而且我得到了很多.谢谢 :).我希望这有帮助.

小智 6

使用实用程序dos2unixunix2dos在unix和windows样式行结尾之间进行转换.


bta*_*bta 5

你的'sed'命令看起来不对.我相信尾随$f - $f应该只是$f.以书面形式运行脚本会在我的系统上挂起很长时间,但进行此更改会导致它几乎立即完成.

当然,最好的答案是使用dos2unix,它旨在处理这个问题:

cd /home/cmccabe/Desktop/files
for f in *.txt ; do
    pref=$(basename -s '.txt' "$f")
    dos2unix -q -n "$f" "${pref}_unix.txt"
done
Run Code Online (Sandbox Code Playgroud)