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

2024-10-22 08:28:00
admin
原创
335
摘要:问题描述:我有以下格式的数据: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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用