SunOs 到 Linux 迁移中的 wc -l 命令问题

SunOs 到 Linux 迁移中的 wc -l 命令问题

我们正在从 SunOS 迁移到 Linux。我在wc -l命令方面遇到一些问题。当我使用时wc -l <file_name>,SunOS 在计数之前给出前导空格,而 Linux 则没有前导空格。这导致我的作业的行计数验证脚本失败。我尝试创建一个像这样的函数来在 Linux 中附加一些前导空格

wc () {    /usr/bin/wc "$@" | sed 's/^/       /';  }

但是它不适用于所有行计数值。如何解决这个问题而不是更改我所有工作的 200 多个脚本。

答案1

实际上,我看到的 Linux(和 OSX)行为与 SunOS 相当匹配,只是位数有一些差异。

HPUX 遵循中的描述POSIX,它显示格式中没有前导空格:

"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>

您可以使用 awk 模仿 SunOS 的格式

#!/bin/sh
wc () {
    /usr/bin/wc "$@" | \
    awk '{
        for (n = 0; n < NF-1; ++n) {
            printf("%8d ", $n);
        }
        printf "%s\n", $NF; }'
}

wc "$@"

我故意在列之间留有空白,以避免 POSIX 基本原理中指出的问题。

答案2

SunOSwc输出与 SYSVr4 的定义匹配。

我看不出与 POSIX 标准有任何真正的差异。甚至wcksh93 的内置功能也与SunOS输出相匹配,最近的 Solaris 11 甚至使用了 ksh93 的wc库实现,而ksh93输出没有任何变化。

如果您的脚本在一个或另一个实现的输出方面存在问题wc,则强烈提示应修复不可移植的脚本。

相关内容