1

私は#huge#テキストファイル(100mbから1gbまで)に取り組んでいます。それらを解析して特定のデータを抽出する必要があります。厄介なのは、ファイルに明確に定義されたセパレータがないことです。

例えば:

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

「(引用符)で制限された文字列の空白を削除する必要があります。問題は、引用符の「外側」の空白を消去してはならないことです(そうしないと、一部の数値がマージされます)。適切なsedソリューションが見つかりません。誰かがこれを手伝ってくれる?

4

3 に答える 3

3

sedではなくawkを使用します。awkまた、GBファイルであっても、ファイル処理を行うための優れたCプログラムであるため、独自のCプログラムを作成する必要はありません。だからここに仕事をするためのワンライナーがあります。

$ 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

ジェイミーのように、私は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 に答える