我正在处理#huge# 文本文件(从 100mb 到 1gb),我必须解析它们以提取一些特定的数据。令人讨厌的是文件没有明确定义的分隔符。
例如:
"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element"
我必须删除受“(引号)限制的字符串中的空格,问题是我不能删除引号“外部”的空格(否则某些数字会合并)。我找不到像样的 sed 解决方案,有人可以帮我弄这个吗?
我正在处理#huge# 文本文件(从 100mb 到 1gb),我必须解析它们以提取一些特定的数据。令人讨厌的是文件没有明确定义的分隔符。
例如:
"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element"
我必须删除受“(引号)限制的字符串中的空格,问题是我不能删除引号“外部”的空格(否则某些数字会合并)。我找不到像样的 sed 解决方案,有人可以帮我弄这个吗?
你使用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"
我想不出一个 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"
,与此有关的事情会引起问题
和 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的文件中。您可以根据口味修改脚本。