在 bash 中使用非换行记录分隔符对表进行排序

在 bash 中使用非换行记录分隔符对表进行排序

我有一张桌子,看起来像

'a;b;f|d;e;c|g;h'

我希望按第三列排序。输出应该是

'g;h|d;e;c|a;b;f'

如果我要使用标准分隔符whitespacenewline那么可以使用 standard 来完成sort

printf '%b' 'a b f\nd e c\ng h' | sort -k 3

会输出

g h
d e c
a b f

sort命令还可以使用以下选项采用非标准字段分隔符-t

printf '%b' "a;b;f\nd;e;c\ng;h" | sort -k 3 -t ';'

会输出

g;h
d;e;c
a;b;f

然而,我未能找到一种方法来对带有非newline记录分隔符的表进行排序。

这能实现吗?如果是这样,怎么办?

编辑

一个关键条件是在此过程中既不改变数据也不改变分隔符,只改变它们出现的顺序。

除了命令之外的其他工具sort也可以。最好符合 POSIX 标准,但不是必须的。

答案1

sort 命令只能对由换行符或 NUL 字符分隔的输入记录进行排序,如手册中所示

排序实用程序按行对文本和二进制文件进行排序。行是通过换行符(默认)或 NUL '\0' 字符与后续记录分隔的记录

因此,您在某些时候的转换需要了解记录分隔符(在您的情况下|)的知识才能达到所需的结果。任何其他命令(Awk/Perl 或 datamash)都需要做出此假设


不是使用单个独立工具,而是使用tr,sortpaste就可以做到。通过一次向管道添加一个命令,您可以看到转换是如何形成的

echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -

相关内容