linux 如何拆分和计算单词在Bash中出现的次数?

ecbunoof  于 2023-02-11  发布在  Linux
关注(0)|答案(3)|浏览(118)

所有人。
我有一个文件,文件名的格式为:

Name Name    Surname Surname

这是具有名称的文件

Nikola  KAZIKOVA
Pavel   MILAN GAZDIK
Nikolas Martin  STRUP
Nikola  GAZDIK
Nikola ČERNÁ
Nikola Martina ČERNÁ

我正在尝试创建一个脚本,在每个名字旁边打印出现的次数。但是我不知道如何计算它们。
这是我的代码,我可以将文本加载到数组中,但我不知道如何计算名称。

#!/bin/bash

file=$1

if [[ -z $1 ]]
    then echo "ERROR: FILE NOT FOUND"
    exit
fi

# Read the file in parameter and fill the array named "array"
getArray() {
    array=() # Create array
    while IFS= read -r line # Read a line
    do
        array+=("$line") # Append line to the array
    done < "$1"
}

# Print the file (print each element of the array)
getArray $file
for e in "${array[@]}"
do
    IFS='   ' read -ra arr <<< "$e"
    echo "${arr[0]}" | grep -o "${arr[0]}"

done

这是我想达到的结果

[4] Nikola  KAZIKOVA
   [1] Pavel   MILAN GAZDIK
   [1] Nikolas Martin  STRUP
   [4] Nikola  GAZDIK
   [4] Nikola ČERNÁ
   [4] Nikola Martina ČERNÁ
e37o9pze

e37o9pze1#

一个选项:

while read -r f l ; do echo "[$(grep -w -c $f d.dat)] $f $l" ; done <d.dat

输出:

[4] Nikola KAZIKOVA
[1] Pavel MILAN GAZDIK
[1] Nikolas Martin  STRUP
[4] Nikola GAZDIK
[4] Nikola ČERNÁ
[4] Nikola Martina ČERNÁ

注意,由于grep在循环中,这不是非常有效。如果你的文件很大,那么你可能需要使用替代工具,如. awkpython
awk替代品;

awk 'NR==FNR{A[$1]++}NR>FNR{for(i in A) {if(i==$1){printf "[%s] %s\n", A[i], $0}}}' d.dat d.dat

输出:

[4] Nikola  KAZIKOVA
[1] Pavel   MILAN GAZDIK
[1] Nikolas Martin  STRUP
[4] Nikola  GAZDIK
[4] Nikola ČERNÁ
[4] Nikola Martina ČERNÁ
ctzwtxfj

ctzwtxfj2#

用你显示的样本,请尝试下面的awk代码。

awk '
{
  value[FNR]=$0
  occur[$1]++
}
END{
  for(i=1;i<=FNR;i++){
    split(value[i],arr,FS)
    print "["occur[arr[1]] "] " value[i]
  }
}
'  Input_file

***说明:***添加上述代码的详细说明。

awk '                                       ##Starting awk program from here.
{
  value[FNR]=$0                             ##Creating array named value which has index as current line number and value as currnet line value.
  occur[$1]++                               ##Creating array named occur with index of 1st field and keep adding same index element here.
}
END{                                        ##Starting END block of this program from here.
  for(i=1;i<=FNR;i++){                      ##Using for loop till value of FNR here.
    split(value[i],arr,FS)                  ##Splitting value[i] into arr with separator as space.
    print "["occur[arr[1]] "] " value[i]    ##Printing values as per requirement here.
  }
}
'  Input_file                               ##Mentioning Input_file name here.
r1zhe5dt

r1zhe5dt3#

这可能对你有用(GNU sed,sort,uniq):

sed 's/ .*//' file |
sort |
uniq -c | 
sed -nE 's/^\s*(\S+) (\S+)/s#^\2\\b#[\1] \&#/p' |
sed -f - file

删除每行中除名字以外的所有内容。
把名字排序。
使用uniq计算每个名称出现的次数。
将上面的结果转换为一个sed脚本,该脚本以[n]为每个名称加上其计数前缀。
将上面的sed脚本应用于原始文件。

相关问题