我正在尝试使用种类对制表符分隔的文件进行排序,如下所示:
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)
这对前两列有效,但对第三列和第四列无效。例如,对于第四列,我得到以下结果:
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 行似乎发生了偏移。我做错了什么?
答案1
这是每个标签转换为的数据|
:
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
答案2
只需额外采取一步(来源:[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
我可以在文件中有多个标签。