Как отсортировать файл с разделителями табуляции?

610
coverflower

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

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-ая строка выглядит сдвинутой в терминале. Что я делаю неправильно?

0
У вас есть несколько вкладок, разделяющих столбцы? glenn jackman 6 лет назад 1
Какой у тебя язык? tripleee 6 лет назад 0
@glenn jackmann: да coverflower 6 лет назад 0
@tripleee: LANG = "en_US.UTF-8" coverflower 6 лет назад 0

2 ответа на вопрос

3
Kamil Maciorowski

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

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 
Я уже пробовал с одной вкладкой, и я подумал, что она тоже не работает, но я ошибся ... Кроме того, вывод выглядит хорошо, но файл все еще не легко читается. Есть ли способ иметь несколько вкладок и сортировка все еще работает? coverflower 6 лет назад 0
@coverflower Я бы обработал данные * *, чтобы иметь отдельные вкладки, и сохранил бы их в этой форме; тогда я мог бы сортировать так, как мне нужно. Каждый раз, когда мне нужна читаемость, я бы использовал `column` в * результате *. Kamil Maciorowski 6 лет назад 0
@coverflower Я добавил замечание о `less`. Kamil Maciorowski 6 лет назад 0
Это выглядит еще лучше с меньшими затратами ... coverflower 6 лет назад 0
0
coverflower

С дополнительным шагом (Источник: [ 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 

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

Похожие вопросы