Неопределенный разделитель, разбирая грязный журнал с sed - PullRequest
1 голос
/ 23 июня 2010

Я работаю с # огромными # текстовыми файлами (от 100 МБ до 1 ГБ), я должен проанализировать их, чтобы извлечь некоторые особые данные.Раздражает то, что файлы не имеют четко определенного разделителя.

Например:

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

Я должен удалить пробелы в строках, ограниченных "(цитата), проблемая не должен стереть пробелы "за пределами" кавычек (в противном случае некоторые числа слились бы). Я не могу найти достойное решение sed, кто-то может мне помочь с этим?

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

вы используете 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 голос
/ 23 июня 2010

Как и Джейми, я не думаю, что sed хорош для работы.Вполне возможно, что мой навык Sed не достаточно хорош для работы.Вот решение, которое по сути такое же, как у Джейми, но в 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 .Вы можете изменить скрипт по вкусу.

1 голос
/ 23 июня 2010

Я не могу придумать решение 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" и тому подобноеэффект вызовет проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...