我正在使用这个命令
cat acronyms.tex | sort -t{ -k1
对字符串格式如下的文件进行排序
\newacronym{ex}{EX}{Expanded}
我想按第一对大括号的内容进行排序。然而,有些线路是这样的
\newacronym[a string]{ex2}{EX2}
我使用的命令无法区分{
和[
,结果是第二个字符串排在第一个字符串之前。
我怎样才能让它区分[
和{
?
答案1
如果出于某种原因您需要排序只是第一对大括号的内容,最简单的方法可能是使用装饰-排序-取消装饰模式。我要使用sed
和cut
,但是有很多选项可以在 shell 中实现此功能:
sed -e 's/^\([^{]*{\([^}]*\)}\)/\2 \1/' < data|sort|cut -d' ' -f2-
该sed
命令替换一切直到结尾第一对大括号的包含大括号的内容、空格,然后是原始字符串。可以像往常一样排序。然后我cut
再次设置我在开始时添加的字段。
这将很好地处理键中的奇数字符和不均匀的长度,尽管空格会成为问题,并且转义\}
也会成为问题。如有必要,可以使用不同的分隔符。
如果数据是:
\newacronym{A}{EX}{Expanded}
\newacronym{F}{EX}{Expanded}
\newacronym{D}{EX}{Expanded}
\newacronym{C}{EX}{Expanded}
\newacronym[abc]{B}{EX}{Expanded}
\newacronym{CD}{EX}{Expanded}
\newacronym[def]{E}{EX}{Expanded}
那么sed
命令的结果是:
A \newacronym{A}{EX}{Expanded}
F \newacronym{F}{EX}{Expanded}
D \newacronym{D}{EX}{Expanded}
C \newacronym{C}{EX}{Expanded}
B \newacronym[abc]{B}{EX}{Expanded}
CD \newacronym{CD}{EX}{Expanded}
E \newacronym[def]{E}{EX}{Expanded}
其余的就很简单了。
答案2
使用-k1
将sort
使用整行作为排序键。这不是你想要的。
我假设您想使用ex
and ex2
(如在 中找到的{...}
)作为密钥。为此,请指定-k2
为排序字段。
这将拾取第一个之后的所有内容{
并将其用作密钥。
\newacronym{ex}{EX}{Expanded}
^^^^^^^^^^^ ^^^ ^^^ ^^^^^^^^^
field 1 f2 f3 field 4
\newacronym[a string]{ex2}{EX2}
^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^^^
field 1 f2 f3
到仅有的使用第二个字段作为键(而不是该行的其余部分),使用-k2,2
.
测试:
$ sort -t '{' -k2,2 file
\newacronym[a string]{ex2}{EX2}
\newacronym{ex}{EX}{Expanded}
该行仍然以错误的顺序出现。这是因为ex2}
排序在前面ex}
(在 ASCII 表中}
排在后面,并且我使用的是 POSIX 语言环境)。2
再试一次,但这次是在 Ubuntu 上使用语言环境(应该可以在任何 glibc Linux 和除或语言环境en_US.UTF-8
之外的大多数语言环境中工作):C
POSIX
$ LC_COLLATE="en_US.UTF-8" sort -t '{' -k2,2 file
\newacronym{ex}{EX}{Expanded}
\newacronym[a string]{ex2}{EX2}
根据您的区域设置,您可能需要也可能不需要添加该LC_COLLATE=...
位。
请注意,这sort
是一个独立于bash
shell 的实用程序,并且无论 shell 是什么,它的工作方式都是相同的。因此,这不是一个“bash
排序”问题,只是一个sort
问题。