这不是一个简单的awk 脚本,但也不难。您只需使用下面的数组a[] 来存储第一个字段的值以获得第二个字段的相等值。如果设置了last(例如,不是第一条记录)并且第二个字段发生更改,则输出当前数组并重置数组(即规则 1)。
在规则 2 中,您只需扫描现有数组并按顺序将当前第一个字段插入数组中。您保留第二个字段的 last 值,以便知道它何时更改。您使用END 规则输出最后一组值,例如
awk -F, '
last && $2 != last {
for (i=1; i<=n; i++)
print a[i]", "last;
delete a
n = 0
}
{
swapped=0
for (i=1; i<=n; i++)
if ($1 > a[i]) {
swapped=1
for (j=n+1; j>i; j--)
a[j]=a[j-1]
a[i]=$1
}
if (!swapped)
a[++n]=$1
else
n++
last=$2
}
END {
for (i=1; i<=n; i++)
print a[i]", "last
}
' file
swapped 标志只是告诉您当前的第一个字段是在现有元素之前插入到数组中 (swapped == 1) 还是刚刚添加到末尾 (swapped == 0)。
使用/输出示例
在名为file 的文件中使用您的示例文件,您可以简单地切换到包含它的目录,用鼠标选择上面的脚本(将文件名更改为您的文件名),然后middle-mouse - 将脚本粘贴到终端,例如
$ awk -F, '
> last && $2 != last {
> for (i=1; i<=n; i++)
> print a[i]", "last;
> delete a
> n = 0
> }
> {
> swapped=0
> for (i=1; i<=n; i++)
> if ($1 > a[i]) {
> swapped=1
> for (j=n+1; j>i; j--)
> a[j]=a[j-1]
> a[i]=$1
> }
> if (!swapped)
> a[++n]=$1
> else
> n++
> last=$2
> }
> END {
> for (i=1; i<=n; i++)
> print a[i]", "last
> }
> ' file
124, 3
123, 3
12345, 2
1010, 1
898, 1
检查一下,如果您有任何问题,请告诉我。