2012-09-03 32 views
0

我有一个文件,该文件是这样的:排序不分先后在AWK数组

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

我想...

  1. 只打印每个最后一个实例在第2列中出现的元素及其在第1列中的相应值;
  2. 按字母顺序排序1的结果,根据第2列的内容;
  3. 将第三列添加到第1列之前的输出,该内容将取决于第2列的值;
  4. 用回车替换标签;

......所有这些都在一个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程序的内容。但是,我不知道我该如何做到这一点。任何想法 ?

回答

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