linux - 确保 .csv 文件在 bash 中每一行的列数相同

标签 linux bash csv awk

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

最佳答案

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 默认值的 print(或任何 true 语句)的简写。此外,file{,} 解析为 file file,用于两次使用相同的文件以用于双 channel 算法。

同样可以使用数组和 END block 通过单遍编写。

关于linux - 确保 .csv 文件在 bash 中每一行的列数相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37888912/

相关文章:

linux - 获取刚刚启动的 screen session 的PID

linux - 使用 grep 搜索包含点的字符串

java - Java 中的 CSV 行读取器

linux - 在 RHEL 7.4 的目录中递归查找字符串并将其替换为 "/"

linux - 如何从目录中的文件名中保存多个 IP 地址?

python - Pandas DataFrame 到控制台格式的 CSV

c# - "\",\x0A\x0D"代码在编写 CSV 时在 C# 中的作用

linux - 快速密码套件

c - 为什么 fseek 使用 read() 系统调用?

linux - 用于创建指向共享库的符号链接(symbolic link)的 Bash 脚本