使用跨不同行匹配的大括号重新格式化和清理 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
我想重新格式化一个纯 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
中删除开始 print RT
:打印修改RT
{
、结束 }
和后跟 0 个或更多空格的换行符
使用 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