搜索模式。将其放入缓冲区并使用正则表达式(Notepad++ 或 cygwin Shell)或 JSFiddle 进行排序
Search for pattern. Put it in buffer and do sorting using regex ( Notepad++ or cygwin Shell ) or JSFiddle
我想识别特定模式并将整行移动到文件的特定部分,从而重新安排文件内容(如您所说)。我更喜欢 notepad++
解决方案,但如果您认为它太复杂,那么 cygwin shell ( awk )
或 JSfiddle
也可以
我将用下面的例子来说明我的观点
I have a pattern that is
"col<variable space>stat<variable space>col ( axx,bvb,ccc) on mr.dan" (<some word> confidence)
e.g.
"col stat col ( a123,b6949,c4433) on Mr.Randy" (Low confidence)
"col stat col ( a1fddf23, b6ff949,c4433 ) on John.Doe " (Low confidence)
"col stat col ( ax ) on John.Dane " (Ok confidence)
"col stat col ( axdf,fsdds ) on Jane.Dame " ( Fair confidence )
它应该做什么
- 删除所有引号,删除
(<word> confidence)
部分并在行尾粘贴 ";"
(我可以管理这部分,这里不需要帮助)
- with 模式的表达式
col ( axdf,fsdds )
col\s+(\s*word1\s*,\s*word2\s*,\s*wordN\s*)\s*on\s*word.word\s*
上面的模式需要重新排列,使一个单词 col ( word)
排在最前面,然后是两个单词 col ( word1, word2)
等等,按照 [=22= 中单词数的升序排列] 表达
所以上面的输出应该是
col stat col ( ax ) on John.Dane ; # 1 word in col (word) expr
col stat col ( axdf,fsdds ) on Jane.Dame ; # 2 words in col (word) expr
col stat col ( a1fddf23, b6ff949,c4433 ) on John.Doe ; ; # 3 words in col (word) expr
col stat col ( a123,b6949,c4433) on Mr.Randy;
我做了什么
我可以使用完成第一部分
"\s*\((\s*(\w+)*\s*Confidence\))
替换为 ;
我需要有关第二部分 col ( word)
表达式重新排列的帮助。
Notepad++
的逻辑伪代码是前两个将每个列表达式中的单词列表隔离在单独的缓冲区中。接下来你计算每个缓冲区中的单词数,然后排列缓冲区。根据您排列表达式的缓冲区排列。
也开放给 JsFiddle
或 Shellscript regex / awk
这不能用 Notepad++ 完成,我建议使用脚本,这里是执行此工作的 Perl 脚本示例。
整个文件在内存中读取,如果文件很大会出问题
#!/usr/bin/perl
use Modern::Perl;
# Read input file in an array
my $file_in = 'file.txt';
open my $fh, '<', $file_in or die "unable to open '$file_in': $!";
my @lines = <$fh>;
# Replace last quote until end of line with semicolon and remove quotes
my @unsorted = map { s/"[^"]*$/;/; s/"//g; $_ } @lines;
# use Schartzian transform for sorting
my @sorted =
# remove the number of words
map { $_->[0] }
# sort on number of words
sort { $a->[1] <=> $b->[1] }
# Add number of words
map {
# list of words inside parenthesis
my ($words) = $_ =~ /\(([^)]+)\)/;
# split to have number of words
my @w = split',', $words;
# add this number as second element in array
[$_, scalar @w]
}
@unsorted;
# Write into output file
my $file_out = 'file_out.txt';
open my $fh_out, '>', $file_out or die "unable to open '$file_out': $!";
say $fh_out $_ for @sorted;
输出文件:
col stat col ( ax ) on John.Dane ;
col stat col ( axdf,fsdds ) on Jane.Dame ;
col stat col ( a123,b6949,c4433) on Mr.Randy;
col stat col ( a1fddf23, b6ff949,c4433 ) on John.Doe ;
我想识别特定模式并将整行移动到文件的特定部分,从而重新安排文件内容(如您所说)。我更喜欢 notepad++
解决方案,但如果您认为它太复杂,那么 cygwin shell ( awk )
或 JSfiddle
也可以
我将用下面的例子来说明我的观点
I have a pattern that is
"col<variable space>stat<variable space>col ( axx,bvb,ccc) on mr.dan" (<some word> confidence)
e.g.
"col stat col ( a123,b6949,c4433) on Mr.Randy" (Low confidence)
"col stat col ( a1fddf23, b6ff949,c4433 ) on John.Doe " (Low confidence)
"col stat col ( ax ) on John.Dane " (Ok confidence)
"col stat col ( axdf,fsdds ) on Jane.Dame " ( Fair confidence )
它应该做什么
- 删除所有引号,删除
(<word> confidence)
部分并在行尾粘贴";"
(我可以管理这部分,这里不需要帮助) - with 模式的表达式
col ( axdf,fsdds )
col\s+(\s*word1\s*,\s*word2\s*,\s*wordN\s*)\s*on\s*word.word\s*
上面的模式需要重新排列,使一个单词 col ( word)
排在最前面,然后是两个单词 col ( word1, word2)
等等,按照 [=22= 中单词数的升序排列] 表达
所以上面的输出应该是
col stat col ( ax ) on John.Dane ; # 1 word in col (word) expr
col stat col ( axdf,fsdds ) on Jane.Dame ; # 2 words in col (word) expr
col stat col ( a1fddf23, b6ff949,c4433 ) on John.Doe ; ; # 3 words in col (word) expr
col stat col ( a123,b6949,c4433) on Mr.Randy;
我做了什么
我可以使用完成第一部分
"\s*\((\s*(\w+)*\s*Confidence\))
替换为 ;
我需要有关第二部分 col ( word)
表达式重新排列的帮助。
Notepad++
的逻辑伪代码是前两个将每个列表达式中的单词列表隔离在单独的缓冲区中。接下来你计算每个缓冲区中的单词数,然后排列缓冲区。根据您排列表达式的缓冲区排列。
也开放给 JsFiddle
或 Shellscript regex / awk
这不能用 Notepad++ 完成,我建议使用脚本,这里是执行此工作的 Perl 脚本示例。
整个文件在内存中读取,如果文件很大会出问题
#!/usr/bin/perl
use Modern::Perl;
# Read input file in an array
my $file_in = 'file.txt';
open my $fh, '<', $file_in or die "unable to open '$file_in': $!";
my @lines = <$fh>;
# Replace last quote until end of line with semicolon and remove quotes
my @unsorted = map { s/"[^"]*$/;/; s/"//g; $_ } @lines;
# use Schartzian transform for sorting
my @sorted =
# remove the number of words
map { $_->[0] }
# sort on number of words
sort { $a->[1] <=> $b->[1] }
# Add number of words
map {
# list of words inside parenthesis
my ($words) = $_ =~ /\(([^)]+)\)/;
# split to have number of words
my @w = split',', $words;
# add this number as second element in array
[$_, scalar @w]
}
@unsorted;
# Write into output file
my $file_out = 'file_out.txt';
open my $fh_out, '>', $file_out or die "unable to open '$file_out': $!";
say $fh_out $_ for @sorted;
输出文件:
col stat col ( ax ) on John.Dane ;
col stat col ( axdf,fsdds ) on Jane.Dame ;
col stat col ( a123,b6949,c4433) on Mr.Randy;
col stat col ( a1fddf23, b6ff949,c4433 ) on John.Doe ;