如何根据列的值获取唯一行

Mic*_*ael 4 command-line awk text-processing

以下输入:

A 13
A 12
B 17
C 33
D 344
C 24
A 5
C 99
Run Code Online (Sandbox Code Playgroud)

我只想获取第一列唯一的行:

B 17
D 344
Run Code Online (Sandbox Code Playgroud)

一个解决方案awk会很好,但其他的东西也是可以接受的。

Spa*_*awk 6

如果你不介意打乱顺序,那么

sort <file> | uniq -uw 1
Run Code Online (Sandbox Code Playgroud)

请参阅man uniq了解更多信息,但这里是重要的部分。

   -u, --unique
          only print unique lines
   -w, --check-chars=N
          compare no more than N characters in lines
Run Code Online (Sandbox Code Playgroud)

  • @Tigger 一个可能的警告是,如果第一个字段的长度不总是相同的字符数。那么它可能需要更复杂的东西。奇怪的是`uniq`有`-s`和`-w`,但只有`-f`,并且没有类似只检查前N个字段的东西。 (2认同)

Cos*_*tas 5

如果你想要awk

awk '
    $1 in ARR{
        ARR[$1] = RS;
        next;
    }
    {
        ARR[$1] = $0;
    }
    END{
        for(i in ARR)
            if(ARR[i] != RS)
                print ARR[i];
    }
    ' file
Run Code Online (Sandbox Code Playgroud)

该脚本将行放入数组 ARR 中,第一个字段作为索引,整行作为值。如果数组已经有相同的索引值更改为 «\n»(新行)符号。在文件结束后打印那些值不等于 «\n» 的数组元素后,会
被告知 awk 的RS变量newline默认是相等的。

或者你可以通过sed 来完成

sort file |
sed '
    :a;
    $!N;
    s/\(\S\+\s\).*\n\1.*/\1\a/;
    ta;
    /\a/P;
    D;
    '
Run Code Online (Sandbox Code Playgroud)


Sat*_*ura 5

awk

awk 'NR==FNR { a[$1]++ } NR!=FNR && a[$1]==1' file file
Run Code Online (Sandbox Code Playgroud)

(文件名被传递两次)。

编辑:如果文件来自stdin您需要一个临时副本。像这样的东西:

tmp="$( mktemp -t "${0##*/}"_"$$"_.XXXXXXXX )" && \
    trap 'rm -f "$tmp"' 0 HUP INT QUIT TERM || exit 1
... | tee "$tmp" | awk '...' - "$tmp"
Run Code Online (Sandbox Code Playgroud)