【问题标题】:reformatting and cleaning CSV file with curly braces matching across distinct lines使用跨不同行匹配的花括号重新格式化和清理 CSV 文件
【发布时间】:2021-01-20 17:45:48
【问题描述】:

我想重新格式化一个纯 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 和 regex'es 摆弄一下,但不知道如何管理它;我觉得使用 awk 的变量 RS 和 ORS 进行调整可能会有所帮助,但无法继续前进......

【问题讨论】:

    标签: regex awk text-processing


    【解决方案1】:

    使用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):从{ 中删除以} 开始,以} 结束和后跟0 个或多个空格的换行符从RT
    • print RT:打印修改RT

    【讨论】:

    • 确实有效;谢谢!你能解释一下命令的逻辑吗?
    • 我会在回答中添加更多解释。
    【解决方案2】:

    您能否尝试使用 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
    

    【讨论】:

      【解决方案3】:

      使用 GNU awk 进行多字符 RS 和 RT:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-17
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 2016-08-17
        • 2020-10-28
        相关资源
        最近更新 更多