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

2024-10-22 08:28:00
admin
原创
67
摘要:问题描述:我有以下格式的数据: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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用