regex - 当存在多个字段分隔符时使用 AWK 忽略字段内的逗号

标签 regex csv awk

我想使用 awkgawk 解析 CSV 记录,如下所示。

字段之间用逗号分隔,但最后一个字段 ($6) 很特殊,因为它实际上由子字段组成。这些子字段由 # 作为字段分隔符(或者,准确地说,“.#”)分隔。这本身不是问题:我可以使用 awk -F'(,)|(. # )' 来设置替代字段分隔符。

但是,最后一个字段中也有一些杂散逗号需要忽略。

有没有办法用 awk 解决这个问题,也许使用 FPAT?

示例记录:

  "http://publications.europa.eu/resource/cellar/3befa3c3-a9af-4dac-baa2-92e95cb6e3ab","http://publications.europa.eu/resource/cellar/3befa3c3-a9af-4dac-baa2-92e95cb6e3ab.0002","EU:C:1985:443","61984CJ0239","Gerlach","Judgment of the Court (Third Chamber) of 24 October 1985. # Gerlach & Co. BV, Internationale Expeditie, v Minister van Economische Zaken. # Reference for a preliminary ruling: College van Beroep voor het Bedrijfsleven - Netherlands. # Article 41 ECSC - Anti-dumping duties. # Case 239/84."

最佳答案

使用 gnu-awk 中的 FPAT 功能,您也许能够做到这一点。我们使用 FPAT 来匹配所有双引号字段或逗号分隔字段。最后我们使用 /\分割最后一个字段。 #/ 正则表达式模式。

s='"http://publications.europa.eu/resource/cellar/3befa3c3-a9af-4dac-baa2-92e95cb6e3ab","http://publications.europa.eu/resource/cellar/3befa3c3-a9af-4dac-baa2-92e95cb6e3ab.0002","EU:C:1985:443","61984CJ0239","Gerlach","Judgment of the Court (Third Chamber) of 24 October 1985. # Gerlach & Co. BV, Internationale Expeditie, v Minister van Economische Zaken. # Reference for a preliminary ruling: College van Beroep voor het Bedrijfsleven - Netherlands. # Article 41 ECSC - Anti-dumping duties. # Case 239/84."'

awk -v FPAT='"[^"]*"|[^,]+' '{
   # loop through all fields except last one
   for (i=1; i<NF; ++i)
      print i, $i
   # split last field using /\. # / regex and print each token
   for (j=1; j<split($NF, a, /\. # /); ++j)
      print i+j-1, a[j]
}' <<< "$s"

1 "http://publications.europa.eu/resource/cellar/3befa3c3-a9af-4dac-baa2-92e95cb6e3ab"
2 "http://publications.europa.eu/resource/cellar/3befa3c3-a9af-4dac-baa2-92e95cb6e3ab.0002"
3 "EU:C:1985:443"
4 "61984CJ0239"
5 "Gerlach"
6 "Judgment of the Court (Third Chamber) of 24 October 1985
7 Gerlach & Co. BV, Internationale Expeditie, v Minister van Economische Zaken
8 Reference for a preliminary ruling: College van Beroep voor het Bedrijfsleven - Netherlands
9 Article 41 ECSC - Anti-dumping duties

关于regex - 当存在多个字段分隔符时使用 AWK 忽略字段内的逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66563519/

相关文章:

regex - BeautifulSoup.find 的返回值是多少?

Python pandas 从嵌入 Web txt 文件中的 csv 创建数据框

linux - sed,awk.grep - 如果该行尚不存在,则在配置部分的末尾添加一行

linux - Grep csv 与来自另一个 csv 的参数

javascript - 有没有办法找出文本/ Markdown 文件中文本的诗歌风格?

c# - 正则表达式 C# 控制台应用程序

regex - Golang 按字符类型拆分字符串

javascript - 将 Papaparse 行转换为对象

java - Linux平台下用SuperCSV写CSV文件

linux - 词频和-gt