Arrays 按awk中的字母顺序对数组排序

Arrays 按awk中的字母顺序对数组排序,arrays,awk,Arrays,Awk,我有一个文件,看起来像这样: 1 a 3 b 2 b 9 a 0 a 5 c 8 b 我想 仅打印第2列中每个元素的最后一个实例及其在第1列中的对应值 对1的结果进行排序。根据第2栏内容按字母顺序排列 在第1列之前的输出中添加第三列,其内容取决于第2列的值 通过回车替换标签 。。。所有这些都在一个awk程序中实现 因此,最终输出类似于: x 0 a x 8 b y 5 c 我成功地完成了这一切,但使用了两个awk程序和一个外部命令: awk -F '

我有一个文件,看起来像这样:

1    a
3    b
2    b
9    a
0    a
5    c
8    b
我想

  • 仅打印第2列中每个元素的最后一个实例及其在第1列中的对应值
  • 对1的结果进行排序。根据第2栏内容按字母顺序排列
  • 在第1列之前的输出中添加第三列,其内容取决于第2列的值
  • 通过回车替换标签 。。。所有这些都在一个awk程序中实现

    因此,最终输出类似于:

    x
    0
    a
    x
    8
    b
    y
    5
    c
    
    我成功地完成了这一切,但使用了两个awk程序和一个外部命令:

    awk -F '\t' '{
        value[$2]=$2"\t"$1 }
        END { for (i in value) print value[i]
        }' | \
    sort -dfb | \
    awk -F '\t' '{
    if ($1 == "a" || $1=="b") print "x\n"$2"\n"$1
    if ($1 == "c") print "y\n"$2"\n"$1
    }'
    
    一种更简单的方法是按字母顺序对第一个awk程序的数组进行排序。这将允许将第二个awk程序的内容合并到第一个awk程序中。然而,我不知道我如何才能做到这一点。有什么想法吗?

    GNU awk=4:


    这是六年前的事了,我在这里回答。。。如果我理解该请求,则值列表为:

    1    a
    3    b
    2    b
    9    a
    0    a
    5    c
    8    b
    
    仅为列2的1个实例处理,关联值最低的为列1。预期结果:

    0    a
    2    b
    5    c
    
    通过使用2种排序而不是awk,该过程似乎最简单。捕获文件中的值列表时,以下命令将显示结果:

    $ sort +0 -1n FILE|sort +1 -2 -u
    0    a
    2    b
    5    c
    
    每个唯一的第2列的顺序相反或第1列的最高值

    $ sort +0 -1nr FILE|sort +1 -2 -u
    9    a
    8    b
    5    c
    
    如果awk优先于排序,则以下awk程序可以执行操作,为每个唯一的第2列条目获取最小值:

    $ awk '{if($2 in COL2){if(COL2[$2]>$1){COL2[$2]=$1}}else{COL2[$2]=$1}}END{for(I in COL2){print COL2[I],I}}' FILE
    0 a
    2 b
    5 c
    
    与此相反,每个唯一的第2列条目的第1列的最大值是通过将“>”替换为
    $ sort +0 -1nr FILE|sort +1 -2 -u
    9    a
    8    b
    5    c
    
    $ awk '{if($2 in COL2){if(COL2[$2]>$1){COL2[$2]=$1}}else{COL2[$2]=$1}}END{for(I in COL2){print COL2[I],I}}' FILE
    0 a
    2 b
    5 c
    
    $ awk '{if($2 in COL2){if(COL2[$2]<$1){COL2[$2]=$1}}else{COL2[$2]=$1}}END{for(I in COL2){print COL2[I],I}}' FILE
    9 a
    8 b
    5 c