是否有 nl 或 seq 的字母等效项?

是否有 nl 或 seq 的字母等效项?

我有一个文件,我想使用“字母表”(简单的 ascii a、b、c 等)而不是数字对行进行编号。那么我可以做的地方:

nl somefile

我想做这样的事情:

abc somefile

并得到如下输出:

a line 1 of file
b line 2 of file
c line 3 of file
...

即使是字母等效的 也seq可以有所帮助——我可以用它paste来给行添加前缀。

为了简单起见,我的文件将有 26 行或更少(因此abc不需要将字母换行,例如 ...x、y、z、aa、ab、ac...之类的东西。)

答案1

使用、和:bash​​pasteheadwcprintf

# generate somefile
$ printf 'line %s of file\n' {1..5} > somefile

# then paste
$ paste -d ' ' <(printf '%s\n' {a..z}) somefile
a line 1 of file
b line 2 of file
c line 3 of file
d line 4 of file
e line 5 of file
f
g
...

由于我们不知道需要生成多少个字符(a-e在本例中),因此我们可以生成完整的字母表,并且只合并尽可能多的行somefile并将其写为函数:

function abc() { paste -d ' ' <(printf '%s\n' {a..z} | head -n $(wc -l <"$1")) "$1"; }

输出:

$ abc somefile
a line 1 of file
b line 2 of file
c line 3 of file
d line 4 of file
e line 5 of file

答案2

您可以使用 awk:

awk '{printf "%c\t%s\n", NR+96, $0}'

(97 是 的 ASCII 十进制值a

% seq 1 10 |  awk '{printf "%c\t%s\n", NR+96, $0}'   
a       1
b       2
c       3
d       4
e       5
f       6
g       7
h       8
i       9
j       10

答案3

在 bash 中打印任何范围的字符,而不仅仅是字母或数字:

$ printf '%b\n' "$(eval printf '\\%03o' $(printf '{%d..%d}' "'!" "'~"))"
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

答案4

Perl 知道如何递增字符串,包括“z”->“aa”等。试试这个:

# a bash function for "alphabetic nl"
anl() {
    perl -sne 'printf "%6s\t%s", $nl++, $_' -- -nl=a "$@"
}

然后你可以做

seq 50 | anl
anl file file ...

相关内容