如何在文本文件的每一行前添加行号和制表符?


45

如何在文本文件的每一行开头添加行号和制表符?


我想知道的是您如何在Windows上执行此操作...
itsadok

4
这应该在stackoverflow上吗?对于超级用户,答案是记事本和很多耐心。
kokos

2
因此,您要添加还是添加。您的标题和正文不同;)
matpie

我想我想在开头加上“ prepend”,这只是黑客的一个词。
理查德·霍斯金斯

在Windows上,与任何其他编程问题一样,您可以安装Cygwin,然后使用下面的答案。
乔纳森·哈特利2013年

Answers:


49
awk '{printf "%d\t%s\n", NR, $0}' < filename

10
或者awk '{print NR, "\t", $0}'
jtbandes

1
使用nl命令行,下面的答案是一个简单得多的解决方案。
丹尼尔·里贝罗

2
@DanielRibeiro更简单,但可靠性更低,灵活性也更低。
乔纳森·哈特利2013年

@DanielRibeiro使用的答案nl也是错误的。在源代码中,它永远不会为您提供正确的行号,因为它不只计算空格。
oligofren

@jtbandes您的解决方案在行号和制表符之间添加空格(至少在我的Mac上如此)
Yossi Vainshtein

55

nl命令应该执行此操作,但是它也会在行号之前添加空格。它是Linux coreutils的一部分。

nl lines.txt
 1  $bkWTN
 2  $cV8$.

4
实际上,您可以告诉nl您省略数字前的空格。只需使用-w1选项告诉它数字的最小宽度为
1。– cjm

2
请注意,“ nl”默认情况下会假设您的文本分为带有页眉和页脚的“页面”,所有页面均由“ \:”或“ \:\:”或“ \:\:\:”等行分隔。如果您的文本中包含任何这样的行,则“ nl”将产生意外的结果,例如吞下这些行,没有编号的节或从节中的1重新开始编号。使用-dXY(其中XY是一对字符,它们不会在文本中单独出现在一行上)以防止此行为。在一般情况下,这可能很难预测,因此我建议使用此页面上的其他解决方案之一。
乔纳森·哈特利

使用“ -w1”不仅会删除数字后的空格,还会将行号截断为仅一个字符的宽度,这意味着您的行号仅显示其最低有效数字。几乎可以肯定这不是您想要的。
乔纳森·哈特利2013年

4
有了-nln你可以左对齐,如果你不想前行号的空间(S)。另外,要指定制表符分隔符,可以使用-s$'\t'-s' '(在的单引号之间插入制表符,ctrl+v然后用tab)。
don_crissti 2014年

2
@JonathanHartley nl -w1(从GNU的coreutils 8.24)不截断的行号。
Skippy le Grand Gourou

10
sed = test.txt | sed 'N;s/\n/\t/'

命令“ sed =“将打印行号,然后是回车,然后是下一行。

表达式“ N; s / \ n / \ t /”将采用每行,获取下一行(即行号和行),并用制表符代替回车符。


用我的sed版本打印不带选项卡的“ t”:8t我看到我们这一代最好的头脑被9t疯狂摧毁,饿死的歇斯底里的裸体,
理查德·霍斯金斯2009年

1
请注意,这\n是换行符(由于在Unix中首次广泛使用,因此通常称为“换行符”),并且\r是回车符。Windows使用\r\n(也称为CRLF)。
卡米洛·马丁

(请挑剔!)
卡米洛·马丁

如果我们要仔细研究一下窗口可能如何不同,那么我们可能需要考虑UTF16。
mc0e

4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -n将行号添加为“ 123 linecontents”,并且该正则表达式将其修改为“ linenumberTABlinecontents”


3
perl -pe "s/^/$.\t$_/" file.txt

要么

perl -ne "print qq($.\t$_)" file.txt

2

怎么样

cat -n somefile.txt


1
没有标签。(需要15个字符的注释是一个愚蠢的要求。)
Richard Hoskins

1
这会在我的系统上产生标签。猫(GNU coreutils)6.10。
innaM

在我的系统上,它添加(tab)number(space)行。BSD实用程序。
理查德·霍斯金斯

2

好,这是一站式的bash解决方案:

$ IFS=$'\n';x=1;for l in $(<file.txt);do echo -e "$x\t$l";((x+=1));done
$ IFS=

第一个IFS设置告诉bash一次读取一行。第二行将IFS重置为默认值。

另外,它完全在您的Shell中运行,并且不执行程序!


1

好的,因为我们正在收集实现此目的的方法,

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 

现在我看到了。确定,删除我自己的帖子。什么?您说SU不允许您删除自己的帖子吗?
凯文M

grep + sed == awk
Tadeusz A.Kadłubowski09年

1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

或对于某些非GNU sed

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'

使用我的sed版本打印不带选项卡的“ t”。
理查德·霍斯金斯

编辑为两次转义;这样尝试。
混乱

如果所有其他方法均失败,则只需单击选项卡。:)(如果您的外壳给您带来麻烦,也可以使用^ V选项卡。)
混乱

sed:1:“ test.txt”:未定义标签“ est.txt”
Richard Hoskins

'cat test.txt | sed -e's / ^ / \\ t /'| cat -n'打印(tab)number(space)\ t(line)
Richard Hoskins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.