不确定的分隔符,使用sed解析凌乱的日志
我正在处理从100mb到1gb的巨大文本文件,我必须解析它们以提取一些特定的数据。令人恼火的是,这些文件没有明确定义的分隔符 例如:不确定的分隔符,使用sed解析凌乱的日志,sed,text-parsing,Sed,Text Parsing,我正在处理从100mb到1gb的巨大文本文件,我必须解析它们以提取一些特定的数据。令人恼火的是,这些文件没有明确定义的分隔符 例如: "element" 123124 16758 "12.4" "element" "element with white spaces inside" "element" 我必须删除引号限制的字符串中的空格,问题是我不能删除引号外的空格,否则一些数字会合并。 我找不到一个像样的sed解决方案,有人能帮我吗?我想不出一个sed解决方案,但是你最好只编写一个小应用程序
"element" 123124 16758 "12.4" "element" "element with white spaces inside" "element"
我必须删除引号限制的字符串中的空格,问题是我不能删除引号外的空格,否则一些数字会合并。
我找不到一个像样的sed解决方案,有人能帮我吗?我想不出一个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这样的事情会导致问题,我不能想出一个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这样的事情会引起问题,就像杰米一样,我认为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的文件中。你可以根据口味修改脚本。像杰米一样,我认为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的文件中。您可以根据口味修改脚本。您使用的是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"
您使用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"
这解决了我的问题。最后一个请求,你能给我解释一下代码吗?非常感谢,我不太熟悉awkby设置双引号作为字段分隔符,引号内的单词具有偶数字段编号。因此,i计数器增加2。gsub将所有空格替换为null。请阅读gawk手册搜索GNU awk以获取更多解决我问题的信息。最后一个请求,你能给我解释一下代码吗?非常感谢,我不太熟悉awkby设置双引号作为字段分隔符,引号内的单词具有偶数字段编号。因此,i计数器增加2。gsub将所有空格替换为null。请阅读gawk手册搜索GNU awk了解更多信息