在awk中按字母顺序对数组进行排序

时间:2012-09-03 12:31:58

标签: arrays awk

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

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

我想......

  1. 仅打印第2列中每个元素的最后一个实例及其在第1列中的相应值;
  2. 根据第2列内容按字母顺序对结果进行排序;
  3. 将第三列添加到第1列之前的输出,其内容将取决于第2列值;
  4. 通过回车替换标签;
  5. ......所有这些都在一个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程序的内容。但是,我不知道我怎么能这样做。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

GNU awk< = 3

WHINY_USERS= awk 'END {
  for (R in r)
    printf "%s\n%s\n%s\n", 
      (R ~ /^[ab]$/ ? "x" : "y" ), r[R], R
  }
{
  r[$2] = $1
  }' infile

GNU awk> = 4

awk 'END {
  PROCINFO["sorted_in"] = "@ind_str_asc"
  for (R in r)
    printf "%s\n%s\n%s\n", 
      (R ~ /^[ab]$/ ? "x" : "y" ), r[R], R
  }
{
  r[$2] = $1
  }' infile

答案 1 :(得分:0)

这是六年前,在这里我要回复...如果我理解请求,则值列表为:

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的过程似乎最简单。捕获FILE中的值列表,以下命令将显示结果:

$ 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列的最大值:

$ 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

可能我没有达到要求,而6年后的响应不是很及时。我在寻找其他东西,发现了这一点,便束手无策。