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

reformatting and cleaning CSV file with curly braces matching across distinct lines

我想重新格式化一个纯 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 文件,每一行都包含原始匹配大括号对中的五个字段。

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

能否请您尝试使用 GNU awk,使用所示示例编写和测试。

awk -v RS="" -v FS="[}{]" '{for(i=2;i<=NF;i+=2){gsub(/\n+ +/," ",$i);print $i}}' Input_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

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

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 中的动作块
  • gsub(/^{|}$|\n */, "", RT):从 RT
  • 中删除开始 {、结束 } 和后跟 0 个或更多空格的换行符
  • print RT:打印修改 RT

使用 GNU awk multi-char RS 和 RT:

$ awk -v RS='{[^}]+}' 'RT{[=10=]=RT; gsub(/[{}]/,""); =; print}' 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