不确定的分隔符,使用sed解析凌乱的日志

不确定的分隔符,使用sed解析凌乱的日志,sed,text-parsing,Sed,Text Parsing,我正在处理从100mb到1gb的巨大文本文件,我必须解析它们以提取一些特定的数据。令人恼火的是,这些文件没有明确定义的分隔符 例如: "element" 123124 16758 "12.4" "element" "element with white spaces inside" "element" 我必须删除引号限制的字符串中的空格,问题是我不能删除引号外的空格,否则一些数字会合并。 我找不到一个像样的sed解决方案,有人能帮我吗?我想不出一个sed解决方案,但是你最好只编写一个小应用程序

我正在处理从100mb到1gb的巨大文本文件,我必须解析它们以提取一些特定的数据。令人恼火的是,这些文件没有明确定义的分隔符

例如:

"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element"
我必须删除引号限制的字符串中的空格,问题是我不能删除引号外的空格,否则一些数字会合并。
我找不到一个像样的sed解决方案,有人能帮我吗?

我想不出一个sed解决方案,但是你最好只编写一个小应用程序来实现这一点

#include <iostream>
#include <string>
using namespace std;

int main() {
    string line;
    while(getline(cin,line)) {
        bool inquot = false;
        for(string::iterator i = line.begin(); i != line.end(); i++) {
            char c = *i;
            if (c == '"') inquot = !inquot;

            if (c != ' ' || !inquot) cout << c;
        }
        cout << endl;
    }
    return 0;
}
那就去吧

./a.outnew.out

免责声明

如果您在引号中的行或多行内容上有转义引号,这将完全阻塞

比如说 这个词很奇怪
这样的事情会导致问题,我不能想出一个sed解决方案,不过你最好还是写一个小应用程序来解决这个问题

#include <iostream>
#include <string>
using namespace std;

int main() {
    string line;
    while(getline(cin,line)) {
        bool inquot = false;
        for(string::iterator i = line.begin(); i != line.end(); i++) {
            char c = *i;
            if (c == '"') inquot = !inquot;

            if (c != ' ' || !inquot) cout << c;
        }
        cout << endl;
    }
    return 0;
}
那就去吧

./a.outnew.out

免责声明

如果您在引号中的行或多行内容上有转义引号,这将完全阻塞

比如说 这个词很奇怪
这样的事情会引起问题,就像杰米一样,我认为sed不适合这份工作。可能是因为我的sed技能不适合这份工作。下面是一个与Jamie基本相同的解决方案,但采用Python:

#!/usr/bin/env python

# Script to delete spaces within the double quotes, but not outside.

QUOTE = '"'
SPACE = ' '

file = open('data', 'r')
for line in file:
    line = line.rstrip('\r\n')
    newline = ''
    inside_quote = False
    for char in list(line):
        if char == QUOTE:
            inside_quote = not inside_quote
        if not (char == SPACE and inside_quote):
            newline += char
    print(newline)
file.close()
将此脚本保存到文件中,例如rmspaces.py。然后,可以从命令行调用脚本:

python rmspaces.py

请注意,脚本假定数据位于名为data的文件中。你可以根据口味修改脚本。

像杰米一样,我认为sed不适合这份工作。可能是因为我的sed技能不适合这份工作。下面是一个与Jamie基本相同的解决方案,但采用Python:

#!/usr/bin/env python

# Script to delete spaces within the double quotes, but not outside.

QUOTE = '"'
SPACE = ' '

file = open('data', 'r')
for line in file:
    line = line.rstrip('\r\n')
    newline = ''
    inside_quote = False
    for char in list(line):
        if char == QUOTE:
            inside_quote = not inside_quote
        if not (char == SPACE and inside_quote):
            newline += char
    print(newline)
file.close()
将此脚本保存到文件中,例如rmspaces.py。然后,可以从命令行调用脚本:

python rmspaces.py

请注意,脚本假定数据位于名为data的文件中。您可以根据口味修改脚本。

您使用的是awk,而不是sed。当然也没有必要创建自己的C程序,因为awk已经是一个优秀的C程序,可以处理文件,即使是GB文件。因此,这里有一个单一的班轮来完成这项工作

$ more file
"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element"

$ awk -F'"' '{for(i=2;i<=NF;i+=2) {gsub(/ +/,"",$i)}}1' OFS='"' file
"element" 123124 16758 "12.4" "element" "elementwithwhitespacesinside" "element"

您使用awk,而不是sed。当然也没有必要创建自己的C程序,因为awk已经是一个优秀的C程序,可以处理文件,即使是GB文件。因此,这里有一个单一的班轮来完成这项工作

$ more file
"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element"

$ awk -F'"' '{for(i=2;i<=NF;i+=2) {gsub(/ +/,"",$i)}}1' OFS='"' file
"element" 123124 16758 "12.4" "element" "elementwithwhitespacesinside" "element"

这解决了我的问题。最后一个请求,你能给我解释一下代码吗?非常感谢,我不太熟悉awkby设置双引号作为字段分隔符,引号内的单词具有偶数字段编号。因此,i计数器增加2。gsub将所有空格替换为null。请阅读gawk手册搜索GNU awk以获取更多解决我问题的信息。最后一个请求,你能给我解释一下代码吗?非常感谢,我不太熟悉awkby设置双引号作为字段分隔符,引号内的单词具有偶数字段编号。因此,i计数器增加2。gsub将所有空格替换为null。请阅读gawk手册搜索GNU awk了解更多信息