【问题标题】:WC command of mac showing one less resultmac的WC命令显示少一个结果
【发布时间】:2012-09-27 07:15:34
【问题描述】:

我有一个超过 60MB 的文本文件。它在 5105043 行中有条目,但是当我执行 wc -l 时,它只给出 5105042 结果,比实际结果少一个。有谁知道为什么会这样?

文件很大时是不是很常见?

【问题讨论】:

    标签: unix


    【解决方案1】:

    最后一行不包含新行。

    获得您想要的结果的一个技巧是:

    sed -n '=' <yourfile> | wc -l
    

    这告诉sed 只是打印文件中每一行的行号,wc 然后计数。可能有更好的解决方案,但这是可行的。

    【讨论】:

    • 是的,这个给出了正确的结果,但是 wc -l 继续给出不正确的结果.. 我真的很困惑
    • @Batman:如果你只是想表演技巧,模拟上面的sed 命令的更好方法是使用awk:awk 'END { print NR }' file.txt。或者,如果您想更正您的文件,使其具有相等数量的行和换行符,请参阅下面的编辑。 HTH。
    • wc 失败,因为最后一行缺少换行符。这是“作弊” - sed 正在输出带有换行符的行,并且您正在计算 sed 输出而不是文件中的实际行。如前所述,还有其他直接适用于文件的解决方案。如果您可以附加一个换行符,这可能是最好的解决方案,但取决于所涉及的系统,可能不是一个选择。
    • @steve 我不是在玩诡计,我发布这篇文章的唯一原因是我想知道它背后的原因。我已经解决了这个问题与哪个有关。我
    【解决方案2】:

    文件中的最后一行可能缺少换行符结尾。 IIRC,wc -l 仅计算文件中换行符的数量。

    如果您尝试:cat -A file.txt | tail 您的最后一行是否包含尾随美元符号 ($)?

    编辑:

    假设您的文件中的最后一行缺少换行符,您可以附加一个换行符来更正它,如下所示:

    printf "\n" >> file.txt
    

    wc -l 的结果现在应该是一致的。

    【讨论】:

    • 运行此命令时出错..cat: 非法选项 -- A
    • 我不熟悉cat 的所有版本。我正在使用cat (GNU coreutils) 8.17。你的有--show-all 选项吗?如果没有,您可以尝试cat -vET file.txt | tail,它应该有相同的结果,这可能适用于更多口味的cat
    • 我刚刚遇到了这个问题,我知道我的列表是每行一个(获取一个以一行空格分隔的 csv 文件并 sed 以每行一个)。我认为可能有重复,所以我运行了 sort -u 但很惊讶排序列表比 wc 中的字数多一个...换句话说,原始文件上的 wc 显示的字数比第 1073 行和第 1074 行少一个. 这对我来说似乎是错误的。当我在 Sublime Text 中查看文件时,我看到 1074 行(最后一行编号是 1074 并且其中有一个值)。我仍然没有弄清楚差异是什么/在哪里。
    • @user107172:文件是否包含 Windows 回车符?复制你的文件,然后dos2unix yourfile.csv
    • 问题是文件最后一行缺少尾随换行符。在这种情况下,最后一行不计为一行,但其中的单词/字节被计算在内。
    【解决方案3】:

    60 MB 似乎有点大文件,但对于小文件。一种选择可能是

    cat -n file.txt
    

    cat -n sample.txt | cut -f1 | tail -1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2023-03-16
      • 2018-02-28
      • 2020-07-19
      • 2017-02-17
      • 2022-07-06
      相关资源
      最近更新 更多