如何对制表符分隔的文件进行排序?

如何对制表符分隔的文件进行排序?

我正在尝试使用种类对制表符分隔的文件进行排序,如下所示:

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

我可以在文件中有多个标签。

相关内容