Простой awk | sort решение:
$ time awk -F, -v OFS=, '{ print substr($1, 1, 3), $2 }' file | sort -u
ber,Paris
cho,Paris
dar,Italy
mil,France
ora,usa
plu,Paris
real 0m0.007s
user 0m0.003s
sys 0m0.006s
Я думал, что было бы быстрее сохранить IO, выполнив -u часть в awk , но этолибо эквивалентный, либо чуть медленнее:
$ time awk -F, -v OFS=, -v SUBSEP=, '
BEGIN { split("", a) }
{ a[substr($1, 1, 3), $2] = "" }
END { for (i in a) print i }
' file | sort
ber,Paris
cho,Paris
dar,Italy
mil,France
ora,usa
plu,Paris
real 0m0.007s
user 0m0.006s
sys 0m0.004s
Но немного быстрее отказаться от канала и выполнить все это в версии awk , которая имеет реализацию asorti()
:
$ time gawk -F, -v OFS=, -v SUBSEP=, '
BEGIN { split("", a) }
{ a[substr($1, 1, 3), $2] = "" }
END { N = asorti(a); for (i=1; i<=N; ++i) print a[i] }
' file
ber,Paris
cho,Paris
dar,Italy
mil,France
ora,usa
plu,Paris
real 0m0.006s
user 0m0.000s
sys 0m0.006s
Итак, вам решать ... первое решение самое простое и, пожалуй, самое гибкое, потому что, если мы хотим немного другой реализации (как, например, сортировка по второму столбцу или изменение числа)символов в substr()
) это довольно просто сделать, потому что между двумя инструментами в конвейере есть хорошее разделение проблем.Однако, если нас беспокоит память и скорость, мы, вероятно, захотим подумать о последнем решении.
Примечания:
- Для чего оно стоит, я сравнил mawk 1.3.3 и gawk 4.2.1 на первых двух решениях и gawk последовательно бьют mawk за время для этих случаев.)
- Я также рассчитал вывод по конвейеру на
/dev/null
, результаты каждой реализации относительно друг друга были похожи.