Если вы хотите упорядочить только по второму столбцу, вы можете попробовать это (с GNUsed
):
sed -E 's/ ([0-9]{1}$)/ 0\1/' file | sort -u -k2,2n
Выход:
male 01
female 04
male 09
male 11
female 13
male 14
basename /reallylongpath/example/longername.vb |cut -d"." -f1
РЕДАКТИРОВАТЬ :это не удастся в случае '.' в имени файла. Однако
basename /reallylongpath/example/lo.ngername.vb |rev| cut -d"." -f2- |rev
предоставит вам правильный
lo.ngername
Для фиксированного расширения можно использовать утилиту basename
:
$ f=/home/test/domain/example.txt
$ basename -- "$f".txt
example
Но так как у вас есть произвольные расширения, вам нужно явно выбрать последнее расширение для перехода к basename
. Здесь можно использовать расширения параметров оболочки:
$ basename -- "$f" ".${f##*.}"
example
Или, пока мы этим занимаемся, используйте расширения параметров для обоих удалений.
$ x="${f##*/}"; x="${x%.*}"; echo "$x"
example
${var##pattern}
принимает var
с удалением самого длинного соответствия префикса pattern
. С %%
вместо этого используется суффикс, а с одним #
или %
— кратчайший префикс или суффикс.
Если вы считаете, что нужно удалить что-то вроде .txt.gz
одинарного расширения, вместо этого вы можете использоватьx="${x%%.*}"
(с двойным %%
).
Обратите внимание, что последнее решение выдаст пустую строку в качестве вывода, если данный путь заканчивается на /
, в то время как basename
будет игнорировать конечные косые черты. Другой случай, требующий внимания, — это когда имена каталогов также могут содержать точки, например /home/test/domain.orig/example.txt.gz
, или когда имя файла вообще не содержит точек. (Я не перепроверял все эти случаи.)
Для обсуждения связанных вопросов см.: