假设我们有一个包含以下文本的文件:
hello hel-
lo world wor-
ld test test he-
lo words words
如果我们只使用空格作为分隔符,我们就会有
hello: 1
world: 1
wor:1
ld:1
he: 1
hel-: 1
test:2
lo: 2
words: 2
换句话说,我们如何处理使用连字符分隔两行的单词并将其视为一个单词?
答案1
这应该可以做到:
sed ':1;/-$/{N;b1};s/-\n//g;y/ /\n/' file | sort | uniq -c
答案2
Perl 对此很方便:-0777 开关会将整个文件转换为单个字符串
perl -0777 -ne '
s/-\n//g; # join the hyphenated words
$count{$_}++ for split; # count all the words
while (($k,$v) = each %count) {print "$k:$v\n"}
' file
world:2
helo:1
hello:2
words:2
test:2
输出将没有特定的顺序。
还有一个更晦涩难懂的:tcl。 tclsh 不像-e
其他语言那样有一个很好的选择,因此单行代码需要更多工作。这样做的优点是保留了文件中单词的顺序。
echo '
set fh [open [lindex $argv 1] r]
set data [read -nonewline $fh]
close $fh
foreach word [split [string map {"-\n" ""} $data]] {
dict incr count $word
}
dict for {k v} $count {puts "$k:$v"}
' | tclsh -- file
hello:2
world:2
test:2
helo:1
words:2
答案3
使用tr
++sed
管道datamash
:
$ tr ' ' '\n' <file | sed '/-/N;s/-\n//' | datamash -s -g1 --output-delimiter=':' count 1
hello:2
helo:1
test:2
words:2
world:2