如何使用Shell命令在每行添加行号?

我的文件,
PSS-A  (Primary A)
PSS-B  (Primary B)
PSS-C  (Primary C)
PSS-D  (Primary D)
PSS-E  (Primary E)
PSS-F  (Primary F)
PSS-G  (Primary G)
PSS-H  (Primary H)
PSS-I  (Primary I)
SPARE  (SPARE)

输出文件,
 1> PSS-A  (Primary A)
 2> PSS-B  (Primary B)
 3> PSS-C  (Primary C)
 4> PSS-D  (Primary D)
 5> PSS-E  (Primary E)
 6> PSS-F  (Primary F)
 7> PSS-G  (Primary G)
 8> PSS-H  (Primary H)
 9> PSS-I  (Primary I)
10> SPARE  (SPARE)
4个回答

这项工作的正确工具是nl
nl -w2 -s'> ' file

你可能想根据文件中的总行数来调整宽度选项(如果你希望数字对齐得漂亮些)。
输出:
 1> PSS-A  (Primary A)
 2> PSS-B  (Primary B)
 3> PSS-C  (Primary C)
 4> PSS-D  (Primary D)
 5> PSS-E  (Primary E)
 6> PSS-F  (Primary F)
 7> PSS-G  (Primary G)
 8> PSS-H  (Primary H)
 9> PSS-I  (Primary I)
10> SPARE  (SPARE)

7nl对包含1、2或3个\:字符串的行进行特殊处理。使用-d $'\n'来避免这种情况。此外,默认情况下,它不会给空行编号。使用-ba来给每一行编号。 - Stéphane Chazelas
@StéphaneChazelas确实,非常感谢!请注意$'...'语法是特定于bash的。 - myrdd
当我看到seq没有做到时,我的心沉了下去。谢天谢地有nl - Sridhar Sarnobat
2@myrdd,$'...' 来自于 ksh93,并且也被 zshmksh、busybox sh、FreeBSD sh 和至少 bash 支持。虽然它还不是标准的,但计划在下一个主要 POSIX 版本中包含进来。 - Stéphane Chazelas
@StéphaneChazelas 谢谢。作为参考,关于$'...'(ANSI-C引用)的可移植性有一个问题:https://unix.stackexchange.com/questions/371827/do-shells-other-than-bash-and-zsh-support-ansi-c-quoting-e-g-string - myrdd
我喜欢nl可以通过-v设置起始数字。 - Onnonymous

如果你想要与你指定的格式相同的内容。
awk '{print NR  "> " $s}' inputfile > outputfile

否则,虽然不是标准做法,但大多数cat命令的实现可以为您打印行号(至少在GNU、busybox、Solaris和FreeBSD实现中,数字填充到宽度6,后跟制表符)。
cat -n inputfile > outputfile

或者你可以使用带有正则表达式的`grep -n`(数字后跟着冒号)来匹配任意行的`^`。
grep -n '^' inputfile > outputfile

是的…两个命令都能工作…但是在cat命令中它会打印行号…但并非我想要的准确结果…但是awk '{print NR "> " $s}' inputfile > outputfile给了我想要的输出结果…:-) @amit kumar - Nainita
2请注意,cat -n 不是可移植的。只有 -u 选项在 POSIX cat 中被指定。 - vinc17

An error occurred:

marked(): input parameter is undefined or null
Please report this to https://github.com/markedjs/marked.
- undefined

在Linux/Unix中,通常有多种方法来完成常见任务。为了完整起见,除了显而易见的方法外,这里还有一些其他的方式可以实现:
    pr -t -n [file]

从一个旧的命令来格式化文本以发送到行打印机。'-t'将省略与终端无关的页眉和页脚信息。
这是一种可爱的sed方法,它在每隔一行上打印行号。我们使用'paste'将它们折叠成一行:
    sed = /etc/passwd | paste - -

或者,我们可以使用唯一真正的编辑器 ed:

    echo '1,$n' | ed -s [file]

或者,ex,vi的非光标寻址的前身:
    printf 'set number\ng/^/p\n' | ex /etc/passwd

最后一个复杂的答案,需要使用ksh93或bash(以及seq命令。使用..范围和eval语句留作练习):

    paste <(seq $(wc -l < [file])) [file]

在Debian Linux、FreeBSD和Solaris 10上进行了测试(最后一个因为没有'seq'而失败)。

我是用以下方法完成的:
命令:cat -n 文件名 | sed -r "s/^\s+//g" | sed "s/^[0-9]*/&\> /g"
输出结果:
cat -n u.txt |sed -r "s/^\s+//g"| sed "s/^[0-9]*/&\> /g"
1>  PSS-A  (Primary A)
2>  PSS-B  (Primary B)
3>  PSS-C  (Primary C)
4>  PSS-D  (Primary D)
5>  PSS-E  (Primary E)
6>  PSS-F  (Primary F)
7>  PSS-G  (Primary G)
8>  PSS-H  (Primary H)
9>  PSS-I  (Primary I)
10>     SPARE  (SPARE)

请添加一个解释,我很想用sed来做这个,但是我不懂这个命令的用法 :) - xeruf