【问题标题】:awk command to create a column based on the values in another two columnsawk 命令根据另外两列中的值创建一列
【发布时间】:2018-05-13 14:29:17
【问题描述】:

我有一个包含两列的文件,例如:

12 c
16 a
50 b
32 b
15 c
25 c
...

我想先根据第二列对表格进行排序,然后对第一列进行降序排序,然后使用“rank.word”创建第三列。

所以输出应该是这样的:

16 a 1.a
50 b 1.b
32 b 2.b
25 c 1.c
15 c 2.c
12 c 3.c
...

排序部分很简单,但知道如何使用 awk 等基本 shell 命令获取第三列吗?

【问题讨论】:

  • 欢迎来到 SO,不清楚请在您的问题中明确添加更多详细信息。

标签: shell awk


【解决方案1】:

sort + awk 解决方案:

sort -k2 -k1nr file | awk '{ print $1, $2, ++a[$2]"."$2 }'

输出:

16 a 1.a
50 b 1.b
32 b 2.b
25 c 1.c
15 c 2.c
12 c 3.c

【讨论】:

【解决方案2】:

awk '{if($2 != prev) idx=1;else idx++;prev=$2;print $1 " " $2 "." idx}'

【讨论】:

    【解决方案3】:

    GNU awk 中的一个(二维数组,for 遍历顺序)。它似乎至少可以使用您提供的数据,但如果它不适用于您的真实数据,请告诉我。

    $ awk '{
        a[$2][$1]++                               # hash data to a, count duplicates 
    }
    END {
        PROCINFO["sorted_in"]="@ind_str_asc"      # start with ordering $2 
        for(i in a) {
            PROCINFO["sorted_in"]="@ind_num_desc" # then $1
            for(j in a[i])
                for(k=1;k<=a[i][j];k++)           # handle duplicates
                    print j,i,++c[i] "." i        # output
            PROCINFO["sorted_in"]="@ind_asc_asc"  # set order for $2 again
         }
    }' file
    16 a 1.a
    50 b 1.b
    32 b 2.b
    25 c 1.c
    15 c 2.c
    12 c 3.c
    

    如果有重复的值对当然会失败。不会再因为重复而失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 2021-12-02
      • 2023-02-23
      • 2020-04-16
      • 2022-08-12
      相关资源
      最近更新 更多