Shell脚本与C性能

Koh*_*kun 10 c bash shell performance

我想知道从C迁移到shell脚本的程序性能会有多糟糕.

我有密集的I/O操作.

例如,在C中,我从文件系统文件中读取循环并写入另一个文件系统文件.我正在接受每一行的部分而没有任何一致的关系.我是用指针做的.一个非常简单的程序.

在Shell脚本中,要移动一行,我正在使用${var:(char):(num_bytes)}.在我完成处理每一行后,我只是将它连接到另一个文件.

"$out" >> "$filename"
Run Code Online (Sandbox Code Playgroud)

该程序执行以下操作:

while read line; do
    out="$out${line:10:16}.${line:45:2}"
    out="$out${line:106:61}"
    out="$out${line:189:3}"
    out="$out${line:215:15}"
    ...
    echo "$out" >> "outFileName"

done < "$fileName"
Run Code Online (Sandbox Code Playgroud)

问题是,C需要半分钟来处理400MB文件,而shell脚本需要15分钟.

我不知道我做错了什么或者没有在shell脚本中使用正确的运算符.

编辑:我不能使用awk,因为没有一个模式来处理该行

我试着评论"echo $ out">>"$ outFileName",但它并没有变得更好.我认为问题是$ {line:106:61}操作.有什么建议?

谢谢你的帮助.

Koh*_*kun 3

正如 Donitor 和 Dietrich 所建议的,我对 AWK 语言做了一些研究,正如他们所说,这再次取得了巨大的成功。这是 AWK 程序的一个小示例:

#!/bin/awk -f
{
    option=substr($0, 5, 9);

    if (option=="SOMETHING"){
        type=substr($0, 80, 1)
        if (type=="A"){
            type="01";
        }else if (type=="B"){
            type="02";
        }else if (type=="C"){
            type="03";
        }

        print substr($0, 7, 3) substr($0, 49, 8) substr($0, 86, 8) type\
        substr($0, 568, 30) >> ARGV[2]

    }
}
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力。处理500mb文件仅需1分钟