我有一个看起来像这样的文件:
1 a
3 b
2 b
9 a
0 a
5 c
8 b
我想......
......所有这些都在一个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程序的内容。但是,我不知道我怎么能这样做。有什么想法吗?
答案 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年后的响应不是很及时。我在寻找其他东西,发现了这一点,便束手无策。