我有一张桌子,看起来像
'a;b;f|d;e;c|g;h'
我希望按第三列排序。输出应该是
'g;h|d;e;c|a;b;f'
如果我要使用标准分隔符whitespace
,newline
那么可以使用 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
,sort
你paste
就可以做到。通过一次向管道添加一个命令,您可以看到转换是如何形成的
echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -