【问题标题】:Filter rows in csv based on condition in nth column根据第 n 列中的条件过滤 csv 中的行
【发布时间】:2019-07-24 08:28:37
【问题描述】:

我正在使用这个 cmd 来过滤 csv 文件。所需的功能在第 19 列中保留标题 + 过滤器 True。

awk -F, 'NR==1 || $19 ~ "True"' output.csv > outputX.csv

当我使用这个 cmd 时,原始文件有 250 行,我得到 101 行,但是当我用 excel 打开原始文件并将第 19 列过滤为“TRUE”时,我得到 112 行(cmd 过滤到 101 行)。 打开原始 csv 显示“True”,(逗号分隔符)。在 excel 中打开获取数据将第 19 行显示为“TRUE”。为什么excel加载True到TRUE? 我想要这个 cmd 的 112 行,这可能是为什么它不同的原因?

希望可以理解。 谢谢。

编辑:Sample

【问题讨论】:

  • edit 你的问题include(不是reference)简洁、可测试的样本输入和预期输出。并且不要使用 19 列以上,您可以展示您对 4 或 5 行的需求,每行 4 或 5 列。通过创建minimal reproducible example,您可能会自己找出问题,而无需提出问题。

标签: csv awk


【解决方案1】:

确保第 19 列有“TRUE”或“True”

如果它是“真”,试试这个:

awk -F, '$19 == "True"{print}' output.csv > outputX.csv

【讨论】:

  • 您的命令对我不起作用...结果文件为空。但是当我将 == 替换为 ~ 时,我得到了 100 行(没有标题)。
  • 你能显示输入文件的前几行吗?
  • 是的。今天晚些时候。
  • 使用 cmd 我应该得到标题 + 前两行,但由于某种原因它过滤掉了 3107。文件在原始帖子中。
  • head -n 5 output.csv > output_5lines.csv
【解决方案2】:

我并没有真正关注,但我想你想要这样的东西:

$ awk -F, '(FNR==1) || (tolower($19) ~ "true")' input.csv > output.csv

如果$19 包含诸如“obstruents”之类的词,这也会匹配。 tolower($19) == "true" 不起作用的原因是因为excel可能引用了这个词。所以这也可能有效:

$ awk -F, '(FNR==1) || (tolower($19) == "\"true\"")' input.csv > output.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2022-12-09
    • 2019-08-17
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多