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

时间:2010-06-22 23:16:27

标签: sed text-parsing

我正在研究#huge #text文件(从100mb到1gb),我必须解析它们以提取一些特定数据。令人讨厌的是文件没有明确定义的分隔符。

例如:

"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element"

我必须删除受“(引用)限制的字符串中的空格,问题是我不能删除”引号外“的空格(否则某些数字会合并)。 我找不到一个像样的sed解决方案,有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:3)

你使用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"

答案 1 :(得分:1)

我无法想出一个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.out < test.log > new.out

<强>声明

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

例如 "The word \"word\" is weird" 这样的事情会引起问题

答案 2 :(得分:1)

像杰米一样,我认为赛德并不适合这份工作。这可能是因为我的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 的文件中。您可以修改脚本以进行品尝。