我正在研究#huge #text文件(从100mb到1gb),我必须解析它们以提取一些特定数据。令人讨厌的是文件没有明确定义的分隔符。
例如:
"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element"
我必须删除受“(引用)限制的字符串中的空格,问题是我不能删除”引号外“的空格(否则某些数字会合并)。 我找不到一个像样的sed解决方案,有人可以帮我这个吗?
答案 0 :(得分:3)
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)
#!/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 的文件中。您可以修改脚本以进行品尝。