Я пытаюсь использовать сортировку для сортировки файла с разделителями табуляции, как этот:

Fruit       Color   Origin              Category
pear        green   Oviedo–Gijón–Avilés Oviedo–Gijón–Avilés
strawberry  red     Reggio Calabria     garden strawberry
apple       green   Oviedo–Gijón–Avilés Arkansas Black
banana      yellow  Makindye Ssabagabo  East African Highland bananas

по каждому столбцу. Вот чем я закончил (<n>: номер столбца):

$ sort -t $'\t' -k <n>  <(tail -n+2 fruits.tsv)

который работает для первых 2 столбцов, но не для 3-го и 4-го столбца. Например, для 4-го столбца я получаю это:

banana      yellow  Makindye Ssabagabo  East African Highland bananas
apple       green   Oviedo–Gijón–Avilés Arkansas Black
pear        green   Oviedo–Gijón–Avilés Oviedo–Gijón–Avilés
strawberry  red            Reggio Calabria      garden strawberry

что неправильно. Кроме того, 4-ая строка выглядит сдвинутой в терминале. Что я делаю неправильно?

2 ответа2

3

Это ваши данные с каждой вкладкой, преобразованной в |:

pear||green|Oviedo–Gijón–Avilés|Oviedo–Gijón–Avilés
strawberry|red||Reggio Calabria||garden strawberry
apple||green|Oviedo–Gijón–Avilés|Arkansas Black
banana||yellow|Makindye Ssabagabo|East African Highland bananas

Как вы можете видеть, есть места, где две вкладки разделяют то, что вы считаете соседними столбцами; sort увидит там столбец с пустой записью.

Решение: перед сортировкой замените несколько вкладок одной вкладкой.

tail -n+2 fruits.tsv | tr -s '\t' | sort -t $'\t' -k <n>

(источник).

Если вы хотите, чтобы вывод выглядел хорошо, передайте результат через column:

… | column -t -s $'\t'

(этот $'\t' будет заменен символом табуляции в bash). Это, однако, будет вводить пробелы вместо вкладок, поэтому окончательный результат будет невозможно проанализировать дальше. Используйте column только при представлении людям.

Некоторые пейджеры (например, less) также могут представлять ваши данные, разделенные табуляцией, более приятным способом:

… | less -x 25
0

С дополнительным шагом (Источник:[ https://stackoverflow.com/questions/18437884/replacing-tabs-with-single-tab-in-sed][1]):

tr -s '\t' '\t' < fruits.tsv > fruits_single_tab.tsv

tail -n+2 fruits_single_tab.tsv | tr -s '\t' | sort -t $'\t' -k 4 | less -x 25

Я могу иметь несколько вкладок в файле.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .