【问题标题】:finding unique values in a data file在数据文件中查找唯一值
【发布时间】:2011-08-05 03:55:38
【问题描述】:

我可以在 python 中做到这一点,但我想知道我是否可以在 Linux 中做到这一点

我有一个这样的文件

name1 text text 123432re text
name2 text text 12344qp text
name3 text text 134234ts text

我想通过特定用户名在第 3 列中查找所有不同类型的值,比如名称 1。

grep name1 filename 给了我所有的行,但是必须有某种方法来列出所有不同类型的值? (我不想显示相同用户名的重复值)

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:
    grep name1 filename | cut -d ' ' -f 4 | sort -u
    

    这将找到所有具有 name1 的行,然后仅获取第四列数据并仅显示唯一值。

    【讨论】:

    • 如果您在另一个字段中有name1 或名为name1foo 的用户,该解决方案可能会给出您不想要的结果。我会 grep "^name1 "(name1 后面有一个空格)以避免这种情况。
    【解决方案2】:

    我尝试使用 cat

    文件包含:(这里的文件是 foo.sh 你可以在这里输入任何文件名)

    $cat foo.sh

    tar
    world
    class
    zip
    zip
    zip
    python
    jin
    jin
    doo
    doo
    

    uniq 只会得到每个单词一次

    $ cat foo.sh | sort | uniq

    class
    doo
    jin
    python
    tar
    world
    zip
    

    uniq -u 将让单词在文件中只出现一次

    $ cat foo.sh | sort | uniq -u

    class
    python
    tar
    world
    

    uniq -d 将获取唯一的重复单词并仅打印一次

    $ cat foo.sh | sort | uniq -d

    doo
    jin
    zip
    

    【讨论】:

      【解决方案3】:

      您可以让 sort 只查看第 4 个键,然后只询问具有唯一键的记录:

      grep name1 | sort -k4 -u
      

      【讨论】:

      • 非常好,这给出了按给定列排序的整行。非常感谢。
      【解决方案4】:

      作为一个多合一的 awk 解决方案:

      awk '$1 == "name1" && ! seen[$1" "$4]++ {print $4}' filename
      

      【讨论】:

        【解决方案5】:

        恕我直言,Michał Šrajer 得到了最佳答案,但在 grep name1 之后需要一个文件名 我有这个使用索引数组的奇特解决方案

        user=name1
        
        IFSOLD=$IFS; IFS=$'\n'; test=( $(grep $user test) ); IFS=$IFSOLD
        declare -A index
        for item in "${test[@]}"; {
            sub=( $item )
            name=${sub[3]}
            index[$name]=$item
        }
        
        for item in "${index[@]}"; { echo $item; }
        

        【讨论】:

          【解决方案6】:

          在我看来,您需要选择需要唯一值的字段。我试图从 IPTables 日志中检索唯一的源 IP。

          cat /var/log/iptables.log | grep "May  5" | awk '{print $11}' | sort -u
          

          这是上述命令的输出:

          SRC=192.168.10.225
          
          SRC=192.168.10.29
          
          SRC=192.168.20.125
          
          SRC=192.168.20.147
          
          SRC=192.168.20.155
          
          SRC=192.168.20.183
          
          SRC=192.168.20.194
          

          所以,最好的办法是先选择字段,然后过滤掉唯一数据。

          【讨论】:

          • catgrep | awk 都是 useless。任何cat a | grep b | awk '{c}' 最好改写为awk '/b/{c}' a
          【解决方案7】:

          以下命令对我有用。

          sudo cat AirtelFeb.txt | awk '{print $3}' | sort -u
          

          在这里它打印具有唯一值的第三列。

          【讨论】:

            【解决方案8】:

            我想你的意思是第四栏。 您可以尝试使用 'cat Filename.txt | awk '{打印 $4}' |排序 |独特的'

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-06-30
              • 1970-01-01
              • 1970-01-01
              • 2014-02-09
              • 2020-06-11
              • 2017-05-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多