Как отсортировать файл с разделителями табуляции?
Я пытаюсь использовать сортировку для сортировки файла с разделителями табуляции, как этот:
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 ответа
Это ваши данные с каждой вкладкой, преобразованной в |
:
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
С дополнительным шагом (Источник: [ 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
Я могу иметь несколько вкладок в файле.