在数据文件中查找唯一值

时间:2011-08-05 03:55:38

标签: linux bash shell

我可以在python中执行此操作,但我想知道我是否可以在Linux中执行此操作

我有一个像这样的文件

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

我希望通过特定的用户名在第3列中找到所有不同类型的值,例如名称1。

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

8 个答案:

答案 0 :(得分:37)

grep name1 filename | cut -d ' ' -f 4 | sort -u

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

答案 1 :(得分:8)

您可以只对第4个键进行排序,然后仅询问具有唯一键的记录:

grep name1 | sort -k4 -u

答案 2 :(得分:6)

我尝试使用 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 :(得分:1)

作为一体化的awk解决方案:

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

答案 4 :(得分:1)

IMHOMichałŠ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; }

答案 5 :(得分:0)

在我看来,您需要选择需要唯一值的字段。我试图从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

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

答案 6 :(得分:0)

以下命令对我有用。

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

此处将打印具有唯一值的第三列。

答案 7 :(得分:0)

我认为您的意思是第四栏。 您可以尝试使用'cat Filename.txt | awk'{print $ 4}'|排序uniq'