regex - 使用跨不同行匹配的大括号重新格式化和清理 CSV 文件

标签 regex awk text-processing

我想重新格式化一个纯 ascii 文件 test.txt,其中包含(只是数百行中的 10 行样本):

{0.91, 0.87, -69.79, 
  -0.3149, 0.05}, {0.9392, 
      1.089, 69, -0.31, 
      0.052}, {-0.8768, 0.7025, 
      69.80, -0.314, 0.053}, 
     {0.930, -1.2638750861516, 69.79, 
      0.314, 0.05301}, {0.9367, 
      -1.368063705085268, 69.79962, -0.31, 
      0.052}, {0.946, -1.644, 
      69.7, 0.3, 0.052}

最终文件 test_processed.txt,包含(对于同一示例):

0.91, 0.87, -69.79, -0.3149, 0.05 
0.9392, 1.089, 69, -0.31, 0.052 
-0.8768, 0.7025, 69.80, -0.314, 0.053 
0.930, -1.2638750861516, 69.79, 0.314, 0.05301 
0.9367, -1.368063705085268, 69.79962, -0.31, 0.052} 
0.946, -1.644, 69.7, 0.3, 0.052

也就是说,一个纯 CSV 文件,每行恰好包含原始匹配大括号对中的五个字段。

我尝试摆弄一下 gawk 和正则表达式,但无法弄清楚如何管理它;我感觉用 awk 的变量 RS 和 ORS 进行调整可能会有所帮助,但无法继续前进......

最佳答案

使用 gnu-awk,您可以使用 RS 使用此 awk 来匹配 {...} 之间的任何内容,然后删除起始 {,结尾 } 和换行符:

awk -v RS='{[^}]+}' 'RT{gsub(/^{|}$|\n */, "", RT); print RT}' file
0.91, 0.87, -69.79, -0.3149, 0.05
0.9392, 1.089, 69, -0.31, 0.052
-0.8768, 0.7025, 69.80, -0.314, 0.053
0.930, -1.2638750861516, 69.79, 0.314, 0.05301
0.9367, -1.368063705085268, 69.79962, -0.31, 0.052
0.946, -1.644, 69.7, 0.3, 0.052

工作原理:

  • -v RS='{[^}]+}':将记录分隔符设置为与 {...} 匹配
  • RT:检查RT是否不为空。 RT 设置为输入中的字符串,与 RS 模式匹配。
  • {...} 是 awk 中的操作 block
  • gsub(/^{|}$|\n */, "", RT):删除起始 {,结束 }和换行符,后跟 RT
  • 中的 0 个或多个空格
  • print RT:打印修改后的RT

关于regex - 使用跨不同行匹配的大括号重新格式化和清理 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64215753/

相关文章:

regex - 有空间还是没有空间

java - 使用正则表达式查找程序中 while 循环的数量

awk - 如何摆脱 awk 致命除以零错误

awk - Gawk 和 systime()

java - 如何判断一个句子是否是疑问句(疑问句)?

javascript - 在 JavaScript 中计算文档中单词的开始和结束位置

python - 如何在文本中查找 x 位数字?

Python 正则表达式带有重音字符的奇怪行为

java - 用破折号替换前导零直到小数点

linux - 将 blkid 中的 UUID 添加到/etc/fstab 中