1

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

例如:

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

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

4

3 回答 3

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"
于 2010-06-23T00:24:19.363 回答
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" ,与此有关的事情会引起问题

于 2010-06-22T23:50:07.670 回答
1

和 Jamie 一样,我认为 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的文件中。您可以根据口味修改脚本。

于 2010-06-23T00:20:35.567 回答