我想重新格式化一个纯 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 中的操作 blockgsub(/^{|}$|\n */, "", RT)
:删除起始{
,结束}
和换行符,后跟RT
中的 0 个或多个空格
print RT
:打印修改后的RT
关于regex - 使用跨不同行匹配的大括号重新格式化和清理 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64215753/