【问题标题】:wc command ignore if column have multiple lines如果列有多行,wc 命令忽略
【发布时间】:2021-08-04 11:00:10
【问题描述】:

我正在尝试使用wc 命令获取 csv 文件的行数

wc -l test.csv

但是,这个命令给了我不正确的计数,因为一列在 csv 文件中有多行。

test.csv 格式:

 column1 column2 column3
 hi      hello   hi
                 hello
 
 I am    busy    right
                 now

对于上面的行,wc 给我计数 4 实际上有 2 行。如果列有多行使用wc 命令,我们可以忽略吗?我在谷歌上搜索了很多,但没有一个给我线索。

【问题讨论】:

  • 文本文件没有行:它们有行。在 CSV 文件中,换行符用作记录分隔符。尽管 CSV 解析器可能允许以某种方式对换行符进行转义以使其在字段值中使用,但 wc 不是 CSV 解析器,并且不知道任何此类约定。
  • wc 根据记录分隔符 \n 计算记录。请添加cat test.csv的输出。
  • 如果您只想计算第一列,请尝试cut -d',' -f1 < test.csv | wc -l
  • 请不要使用图片来展示您的文字数据。您的工具的视觉表示不会告诉我们文件中的内容。我们需要知道这一点才能正确理解wc 输出。复制粘贴文本文件的内容并缩进 4 个空格。并采取the tour,也许。
  • @RenaudPacalet 完成。

标签: bash unix count wc


【解决方案1】:

您的 CSV 显然用空行分隔其记录。因此,您可以尝试计算空行并添加一个:

echo $(( $(grep '^$' test.csv | wc -l) + 1 ))

如果您的记录分隔符不是真正的空行而是空行(只有空白字符的行),您可以使用:

echo $(( $(grep -E '^\s*$' test.csv | wc -l) + 1 ))

但是如果记录分隔符是任意数量的空行,或者如果您也可以有前导和尾随空行,最好的选择可能是使用awk 特殊功能:

awk 'END {print NR}' RS="" test.csv

如果记录分隔符(RSawk 变量)是空字符串,则通过“特殊规定 [it] 表示记录由一个或多个空行分隔”。所以这个awk 命令基本上做的是考虑这个记录分隔符解析你的文件,最后(END 伪条件)打印最后一个记录号(NR)。

【讨论】:

    【解决方案2】:

    我通过使用以下命令获得了有效计数

    gawk -v RS='"' 'NR % 2 == 0 { gsub(/\n/, "") } { printf("%s%s", $0, RT) }' test.csv | wc -l
    

    【讨论】:

    • 在你的例子中,它给出了...... 6!请编辑您的问题,使其至少与您自己的答案相匹配。或者彻底删除。事实上,它对其他人有用的可能性很小。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2013-07-11
    • 2018-07-11
    • 2018-06-20
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多