Arrays Bash获取uniq元素并过滤这些值

Arrays Bash获取uniq元素并过滤这些值,arrays,linux,bash,shell,unix,Arrays,Linux,Bash,Shell,Unix,bash新手。 我有一个文本文件test.txt,其中有两个键,一个是user\u type,另一个是user。目前,user\u type有两种类型的值“admin”或“guest”,并且user可以有任何类型的值 { user_type: admin user: john } { user_type: guest user: doe } {user_ty

bash新手。 我有一个文本文件test.txt,其中有两个键,一个是user\u type,另一个是user。目前,user\u type有两种类型的值“admin”或“guest”,并且user可以有任何类型的值

     {  user_type: admin
        user: john    
             }
     { user_type: guest
       user: doe               
      }

     {user_type: admin
      user: test 
         }

     { user_type: admin
       user: something 
       } ........
我正在尝试使用

    cat man.txt|sort|uniq    
但它似乎不起作用

  • 如何获取与用户类型密钥关联的uniq值
  • 2.如何根据用户筛选值并计算用户类型值?我有一个数组,其中包含值

     array = (doe,test)  #This array can have any values from the user values of man.txt
    
    注意:这个数组是从一个api请求生成的,该请求有一些选择“用户”的标准,我只想计算与数组中的值关联的用户类型值

    现在我只需要与该数组关联的user\u type值。 并计算特定类型重复多少次的用户类型值

     for i in ${array[@]};do
         grep -c $i man.txt
    
    但它正在恢复产出:

         user:doe
      or user:test
    

    但是它不会返回user\u type的特定值的计数?

    如果您可以确定文件中的行始终按顺序排列:
    user\u type
    user
    ,那么您可以执行以下操作:

    array=("test" "doe")
    for username in "${array[@]}"; do
        grep -B1 "$username" man.txt | grep -o 'user_type:.*' | sort | uniq -c
    done
    

    其中,
    grep-B1
    在匹配上方输出一行,然后我们匹配该行以仅获得
    user\u type
    输出,通过管道传输到
    sort
    ,并使用
    uniq
    计算行数。感谢您指出。我修复了它。您可以解释更多关于2)数组是如何形成的,不清楚的是,这是一个破碎的
    JSON
    文件吗?我解释了数组的形成。实际上,JSON文件是由我使用“一些API请求”| jq.[]从API请求生成的。{“user|type”:.user|type,“user”:.group.user}如果你对
    jq
    感到满意,那么为什么要使用
    grep