Если вам необходимо сохранить желаемый порядок вывода, вы можете использовать awk
и 3-массивы для хранения количества раз, которое видны первые два поля (массив a
), массив, который сохраняет порядок встречаются первые два поля (массив b
) и, наконец, массив, который отображает первые два поля с первым видимым третьего поля (массив c
):
awk -v n=1 '{ a[$1" "$2]++ }
$1" "$2 in c {next}
{ b[n++]=$1" "$2;
c[$1" "$2]=$3
}
END { for (i in b) print a[b[i]], b[i], c[b[i]] }
' file
выше $1" "$2
- это объединение первых двух полей, используемых в качестве общего индекса для массивов a
и c
и используемых в качестве значения в массиве b
, которое сохраняет порядок.
Пример Использование / Выходные данные
Имея входной файл в file
, вы можете просто скопировать и вставить средней кнопкой мыши сценарий выше в xterm в каталоге, содержащем file
, и ваш результат будет в указанном вами порядке :
$ awk -v n=1 '{ a[$1" "$2]++ }
> $1" "$2 in c {next}
> { b[n++]=$1" "$2;
> c[$1" "$2]=$3
> }
> END { for (i in b) print a[b[i]], b[i], c[b[i]] }
> ' file
2 a b 125
2 d t 485
1 d f 859
1 a t 154
Использование SUBSEP
Как указано @JonathanLeffler в комментариях ниже, вы также можете указать индексирование как a[$1,$2]
, используемое для представления многомерных массивов. где символ ','
заменяется встроенной переменной SUBSEP
, равной "\034"
. Для этого также требуются корректировки во втором тесте правила и значение для массива b
. С корректировками вы получите:
awk -v n=1 '{ a[$1,$2]++ }
$1 SUBSEP $2 in c { next }
{
b[n++]=$1 SUBSEP $2
c[$1,$2]=$3
}
END {for (i in b) print a[b[i]], b[i], c[b[i]]}
' file
Здесь будет работать либо конкатенация, либо разделение с SUBSEP
, но для формального моделирования многомерного массива следует использовать SUBSEP
.