2014-06-18 47 views
0

我使用的是由猛砸管道与SED和削减

returnedValue=`sed -n -e "$2 p" $1 | cut -c $START-$END` 

组成的管道,其中$ 1是一个文件名非常缓慢,$ 2是$ 1 $开始 - $ END特定行是在initial-结束位置在行中。

我需要计算$ returnedValue很多时间,它非常缓慢。

有没有更好的方法来做到这一点?

上述指令的计算复杂度在哪里?

感谢,

卢卡

+1

您可以在遇到该行或“awk”NR == $ 2 {print; quit}“''后使用'sed -n”$ 2 {p; q}“'退出。 – Kevin

+0

'sed -n“1 {p; q}”filename'返回命令乱码 – lucavb

+0

您是否在mac/BSD上?他们不喜欢';',你需要使用'$ 2 $'{p \ nq \ n}'',但首先看到我的答案。 – Kevin

回答

1

按照基准在the answers here(免责声明:我的答案是公认的一个),以获得该行的最快的方法将是

returnedValue=`head -n +$2 "$1" | tail -n 1 | cut -c "$START-$END"` 

原始命令的复杂性是O(N),其中N是文件中的行数,这是O($ 2)。此外,headtail仅用于从文件中挑选某些行,因此它们针对此任务进行了高度优化。

+0

尾巴部分错过了什么?它返回尾部简介... O(n)只有当我假设'sed -n -e“$ 2 p”$ 1 | cut -c $ START- $ END'就像一个常量。 – lucavb

+0

看起来像solaris不使用'-n',除非你使用/ usr/xpg4/bin/tail,所以只需使用'tail -1'。 – Kevin

+0

我不确定'head'部分可以在Solaris上工作,它的工具非常基本。你可以使用/ usr/xpg4/bin/tail和/ usr/xpg4/bin/head吗? – Kevin