Linux bash文件中的单词列表

Linux 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

我想做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*$" | 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