【问题标题】:Ensure .csv file has same number of columns for each row in bash确保 .csv 文件在 bash 中的每一行具有相同数量的列
【发布时间】:2016-06-17 19:18:36
【问题描述】:

我在 Linux 服务器中有一个 csv 文件,该文件具有多行和不同的字段。我想确保所有记录都具有最大列数(空值)作为具有最大列数的行。我需要在 bash 脚本中实现这一点。如果可能的话,我想尝试使用 awk 我只是 bash 的新手。

【问题讨论】:

  • 您的列是如何分隔的? awk '{NF=5}1' file.txt 将按空格分割每一行并打印前 5 列。并且你可以使用-F ',' 所以设置逗号作为分隔符。
  • 是的,它们用逗号分隔。

标签: linux bash csv awk


【解决方案1】:

awk 来救援。 您可以使用 T.J. 的示例输入文件在一个脚本中完成所有操作

$ awk -F, -v OFS=, 'NR==FNR{if(max<NF)max=NF;next}; 
                           {NF=max}1' file{,} 
1,2,3,4,5,
1,2,3,4,,
1,2,3,,,
1,2,3,4,5,6

解释:这是一个双通算法,第一轮计算最大值,第二轮使用。 NR==FNR 仅对第一个文件为真,计算最大值,注意不需要初始化最大值,因为默认值为零并且长度为非负数。 next 跳过脚本的其余部分。在第二轮设置NF=max 用较少的字段填充记录。 1 用作基于awk 默认值的打印(或任何真实声明)的简写。同样file{,} 解析为file file 两次使用相同的文件进行双通道算法。

同样可以通过使用数组和 END 块的单次传递来编写。

【讨论】:

  • T.J. 的样本在哪里?
  • Bravo - 最佳答案!感谢您添加解释。
  • 工作得很好!谢谢!很好的解释。我是 bash 的新手,所以当有人解释发生了什么时会很棒,尤其是 awk!
猜你喜欢
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2012-06-17
  • 2014-03-14
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多