*如何在* *Bash* 中解析 *CSV* 文件?
在bashshell 中解析逗号分隔值文件(即CSV文件)可能具有挑战性,并且容易出错,具体取决于 CSV 文件的复杂性。不过,这是许多自动化 shell 脚本中的常见任务,或者用于快速处理和重新格式化来自 bash 中下载的文件 的数据。本文介绍了如何使用内置的 Bash 命令或使用awk命令行来解析 CSV 文件,以处理更复杂的格式。下面提供的解决方案可以轻松地适应其他文件格式,例如制表符分隔值文件(即TSV 文件)。在本文的示例中,我使用来自 datahub.io 的一个 [CSV 文件],其中包含国家/地区列表及其两位字母代码(ISO 3166-1)。该 CSV 文件包含两个字段Name和Code,共有 249 条条目 + 1 行标题,总共 250 行。$head-n5countries.csv Name,Code Afghanistan,AF Åland Islands,AX Albania,AL Algeria,DZ...CSV 文件格式是什么?CSV文件是一种包含逗号分隔值的文件。尽管这种文件格式已经使用了数十年并广泛应用于各种软件,但它实际上并不是一种标准文件格式。CSV 文件没有正式的规范,这导致了解析它们的复杂性。某些软件可能容忍不同的复杂用例,例如支持多行字段或某些自定义分隔符。最接近规范的是 IETF RFC 4180 和 IETF RFC 7111,它们将 CSV 的 IANA MIME 类型指定为text/csv。你可以在 RFC 4180 的第 2 节中找到关于 CSV 格式尝试性共同定义的良好概述。高层摘要可能如下:每条记录位于单独的行上,由换行符分隔文件中的最后一条记录可以以换行符结尾,也可以不以换行符结尾可能有一个可选的标题行在标题和记录中,可能有一个或多个字段由逗号(,)分隔每个字段可以用双引号括起来,也可以不用当字段包含换行符、双引号和逗号时,应该用双引号括起来包含双引号的字段应该用另一个双引号进行转义根据上述标准,此类文件的表示可能如下所示。CRLF 表示法表示 CSV 文件中的换行符。带有row3的记录行表示包含转义双引号、空格和换行符的字段。header_column_1,header_column_2,header_column_3 CRLF row1_field1,row1_field2,row1_field3 CRLF row2_field1,row2_field2,row2_field3 CRLF "row3""field1","row3 field2","row3 CRLF field3" CRLF row4_field1,row4_field2,row4_field3在 bash 中尝试解析 CSV 文件时,了解数据源来源以及你是否应期望支持复杂格式非常重要。在某些情况下,你可能别无选择,只能使用外部库来支持某些复杂格式。如何在 Bash 中解析 CSV 文件?使用Bash 内置命令要遍历我们的示例数据,最简单的方法是读取文件并使用内部字段分隔符(IFS)。你可以在我的博文 bash 环境变量 中了解更多关于IFS变量的信息。要读取 csv 文件的每一行,你可以使用内置命令read,它从标准输入中读取一行并将其拆分为字段,将每个单词分配给一个变量