如何使用 sort 命令对制表符分隔的文件进行排序?

2024-10-22 08:28:00
admin
原创
95
摘要:问题描述:我有以下格式的数据:foo<tab>1.00<space>1.33<space>2.00<tab>3 现在我尝试根据最后一个字段按降序对文件进行排序。我尝试了以下命令,但排序结果不符合我们的预期。$ sort -k3nr...

问题描述:

我有以下格式的数据:

foo<tab>1.00<space>1.33<space>2.00<tab>3

现在我尝试根据最后一个字段按降序对文件进行排序。我尝试了以下命令,但排序结果不符合我们的预期。

$ sort -k3nr file.txt  # apparently this sort by space as delimiter

$ sort -t"    " -k3nr file.txt
  sort: multi-character tab `\\t'

$ sort -t "`/bin/echo '    '`" -k3,3nr file.txt
  sort: multi-character tab `\\t'

正确的做法是什么?


解决方案 1:

使用bash可以达到这个目的:

$ sort -t$'    ' -k3 -nr file.txt

注意单引号字符串前面的美元符号。您可以在bash手册页的 ANSI-C 引用部分中阅读有关它的内容。

解决方案 2:

默认情况下,字段分隔符是从非空白到空白的过渡,因此制表符应该可以正常工作。

但是,这些列是以 1 和 0 为基数进行索引的,因此您可能需要

sort -k4nr file.txt

按第 4 列的数字反向对 file.txt 进行排序。(尽管问题中的数据有 5 个字段,因此最后一个字段的索引为 5。)

解决方案 3:

您需要在 -t\ 后面放置一个实际的制表符,要在 shell 中执行此操作,请按 ctrl-v,然后按制表符。我使用过的大多数 shell 都支持这种文字制表符输入模式。

但要小心,因为从其他地方复制和粘贴通常不会保留标签。

解决方案 4:

$ 解决方案对我来说不起作用。但是,通过将制表符本身放入命令中确实可以:sort -t'' -k2

解决方案 5:

我想要一个适用于 Windows 的 Gnu 排序解决方案,但上述解决方案在命令行上都不适用于我。

使用 Lloyd 的线索,以下批处理文件 (.bat) 对我有用。

在双引号内输入制表符。

C:>cat foo.bat

sort -k3 -t"    " tabfile.txt

解决方案 6:

我在 bash shell 中使用 cygwin 进行排序时遇到了这个问题。如果我指定了-t$' ' -kFg,其中 F 是字段编号,它不起作用,但是当我同时指定-t$' '-kF,Fg(例如-k7,7g第 7 个字段)时,它起作用了。-kF,Fg没有 则-t$' '不起作用。

解决方案 7:

sort -t "$(printf ' ')"对我有用

解决方案 8:

一般来说,如果可以避免的话,保存这样的数据并不是一件好事情,因为人们总是混淆制表符和空格。

使用脚本语言(例如 Perl、Python 或 Ruby)解决您的问题非常简单。以下是一些示例代码:

#!/usr/bin/perl -w

use strict;

my $sort_field = 2;
my $split_regex = qr{s+};

my @data;
push @data, "7 8     9";
push @data, "4 5     6";
push @data, "1 2     3";

my @sorted_data = 
    map  { $_->[1] }
    sort { $a->[0] <=> $b->[0] }
    map  { [ ( split $split_regex, $_ )[$sort_field], $_ ] }
    @data;

print "unsorted
";
print join "
", @data, "
";
print "sorted by $sort_field, lines split by $split_regex
";
print join "
", @sorted_data, "
";

解决方案 9:

通过类似 的管道将其传输出去awk '{ print print $1" "$2" "$3" "$4" "$5 }'。这会将空格更改为制表符。

解决方案 10:

如果您希望仅使用制表符来让自己更轻松,请将空格替换为制表符:

tr " " "    " < <file> | sort <options>

解决方案 11:

Lars Haugseth 的答案仅适用于命令行,如果从 shell 脚本执行则会出现此错误:

排序:多字符制表符 '$\t'

如果有人在看的话,解决方案是使用 shell 脚本编码的

sort -t'    '

制表符位于引号之间。

解决方案 12:

使用 sed 将所有空格替换为下划线或文件中其他位置不包含的任何其他字符。然后排序,然后将下划线替换回空格:

sed 's/ /_/g' input | sort -k3nr | sed 's/_/ /g' > output
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用