1

我有一个包含大量数值(+2M)的文件“tbook1”。我必须在 bash (Solaris / RHEL) 中执行以下操作:

Do following:
Remove 1st and last 2 lines
Remove (,") & (")
Substitute (, ) with (,)

我可以使用两种方法来做到这一点:

Method1:
sed -e 1d -e 's/,"//g' -e 's/, /,/g' -e 's/"//g' -e 'N;$!P;$!D;$d' tbook1 > tbook1.3

method2:
tail -n +2 tbook1 | head -n -2 > tbook1.1
sed -e 's/,"//' -e 's/, //' tbook 1.1 > tbook1.2

我想知道哪个更好,即更快更高效(资源使用)?

4

3 回答 3

1

方法 1 通常会更有效,主要是因为方法 2 的额外管道和读取和写入的中间文件..

于 2013-03-20T07:24:11.747 回答
1

方法一只扫描一次文件并写入1个结果(但请将结果存储在不同名称的文件中) 方法二2扫描原始文件和中间结果并写入中间和最终结果。它肯定会慢两倍左右。

于 2013-03-20T07:25:13.197 回答
1

我认为head并且tail对于这个行消除任务比 pure 更有效sed。但是另外两个答案也是对的。您应该避免运行多次。

您可以通过将它们链接在一起来改进第二种方法:

tail -n +2 book.txt | head -n -2 | sed -e 's/,"//' -e 's/, //'

然后head更快tail。自己尝试(在合理大小的文件上):

#!/usr/bin/env bash

target=/dev/null

test(){
        mode=$1
        start=$(date +%s)
        if   [ $mode == 1 ]; then
                sed -e 1d -e 's/,"//g' -e 's/, /,/g' -e 's/"//g' -e 'N;$!P;$!D;$d' book.txt > $target
        elif [ $mode == 2 ]; then
                tail -n +2 book.txt | head -n -2 | sed -e 's/,"//' -e 's/, //' > $target
        else
                cat book.txt > /dev/null
        fi

        ((time = $(date +%s) - $start))
        echo $time "seconds"
}

echo "cat > /dev/null"
test 0

echo "sed > $target"
test 1

echo "tail/head > $target"
test 2

我的结果:

cat > /dev/null
0 seconds

sed > /dev/null
5 seconds

tail/head > /dev/null
3 seconds
于 2013-03-20T07:59:04.697 回答