Linux bash文件中的单词列表
我想做Unix脚本,从文件中打印一个uniq单词列表,并打印这个单词出现的行数列表 对于eample file.txtLinux bash文件中的单词列表,linux,bash,unix,Linux,Bash,Unix,我想做Unix脚本,从文件中打印一个uniq单词列表,并打印这个单词出现的行数列表 对于eample file.txt Lorem ipsum dolor elit, Lorem elit. 输出 Lorem 1,3 ipsum 2 dolor 2 elit 2,3 我的代码: cat file.txt | tr '[:space:]' '[\n*]'| tr '[:digit:]' '[\n*]'| tr '[:punct:]' '[\n*]' | grep -v "^\s*$" | s
Lorem
ipsum dolor elit,
Lorem elit.
输出
Lorem 1,3
ipsum 2
dolor 2
elit 2,3
我的代码:
cat file.txt | tr '[:space:]' '[\n*]'| tr '[:digit:]' '[\n*]'| tr '[:punct:]' '[\n*]' | grep -v "^\s*$" | sort -f | uniq
我不知道我该怎么做。。。有人能帮我吗?此awk代码适用于您的示例:
awk '{for(i=1;i<=NF;i++){
gsub(/[.,:;]/,"",$i)
a[$i]=($i in a)?a[$i]","NR:NR}}
END{for(x in a)print x,a[x]}' file
awk'{for(i=1;i一些只写perl:
perl -nE '
push @{$refs{$_}}, $. for /(\w+)/g
} END {
say $_, "\t", join(",", @{$refs{$_}}) for keys %refs
' file
它不会将单词的顺序输出为“当它们在文件中遇到时”:顺序未指定
此外,如果一个单词在一行上出现两次,行号将被添加两次。要改进这一点:
perl -MList::Util=uniq -nE '
push @{$refs{$_}}, $. for uniq /(\w+)/g
} END {
say $_, "\t", join(",", @{$refs{$_}}) for keys %refs
' file
如果您不介意单词的顺序与文件中遇到的顺序不同:
awk -F[^[:alpha:]] '{for (i=1; i<=NF;i++)
if ($i) a[$i]=a[$i]?a[$i] "," NR:NR}
END {for (e in a) print e,a[e]}' file
awk -F[^[:alpha:]] 'FNR==NR{for (i=1; i<=NF;i++)
if ($i) a[$i]=a[$i]?a[$i] "," NR:NR
next}
{for (i=1; i<=NF;i++){
if ($i in seen) continue
else if ($i) {
print $i,a[$i]
seen[$i] } }
}' file file
awk-F[^[:alpha:]'{for(i=1;我已经试过写东西了,你坚持了哪一步?是:cat file.txt | tr'[:space:'[\n*]'| tr'[:digit:'[\n*]'| tr'[:punch:'[\n*]'.\grep-v'^\s*$'| sort-f | uniq用这段代码完成你的第一篇文章,并解释你没有成功地做你想做的事情。@dawg我确实考虑过[:putt:
,但它包含-
或
,我认为在进行字数计算时不应该删除它。
awk -F[^[:alpha:]] 'FNR==NR{for (i=1; i<=NF;i++)
if ($i) a[$i]=a[$i]?a[$i] "," NR:NR
next}
{for (i=1; i<=NF;i++){
if ($i in seen) continue
else if ($i) {
print $i,a[$i]
seen[$i] } }
}' file file