如何为AWK /…替换开始的行增加计数器?


9

我最初考虑过SED(sed "s/^/COUNTER \&/" /tmp/1.tex),但是它是为单行设计的,我无法通过sed来增加计数器本身,所以现在考虑awk一下gawk,因为我在集成方法方面有丰富的经验。数据

What & South Dragon & North Dragon    & 5 \\ \hline
What & South Dragon & North Dragon    & 5 \\ \hline
What & South Dragon & North Dragon    & 5 \\ \hline

预期产量

1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

操作系统:Debian 8.5

Answers:


11

nl 是对文件的行进行编号的实用程序。

nl /path/to/file

在您的特定情况下:

$ nl  -s ' & ' input.txt                                                                                                 
     1 & What & South Dragon & North Dragon    & 5 \\ \hline
     2 & What & South Dragon & North Dragon    & 5 \\ \hline
     3 & What & South Dragon & North Dragon    & 5 \\ \hline

您如何将其与前置计数器和&符结合使用?--适用于柜台,但不确定是否也适用于柜台。
莱奥波德·赫兹(LéoLéopoldHertz)2016年

3
nl -s ' &' /path/to/file-s指定什么将数字与输入文件的主体分隔开。
DopeGhoti

1
nl不同于cat -nawk解决方案,因为它默认情况下不对空行进行编号
iruvar

10

这实现了您所追求的。(和一样awk '$0=NR" & "$0' filename,但这有点神秘)

awk '{print NR,"&",$0}' filename
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

或者,如果可以的话sed,也可以得到相同的结果。

sed = filename | sed 'N;s/\n/ \& /'

perl 方法。

perl -pe '$_="$. & $_"' filename
perl -pe 's/^/$. & /' filename

您如何找到这种语法的sed = filename | ...?--我不知道您可以使用带equal符号的sed 。--您的sed陈述可以在动态环境中工作吗?有什么弱点吗?
莱奥波德·赫兹(LéoLéopoldHertz)2016年

1
@LéoLéopoldHertz준영我在手册页下查看,=操作员在“零地址或单地址命令”部分下。
Sergiy Kolodyazhnyy

是的= Print the current line number。因此,该功能实际上是sed内置的。真好!
莱奥列奥波尔德·赫兹준 영

3

Python可能是一个很好的替代工具:

$ python -c "import sys;lines=[str(i)+' & '+l for i,l in enumerate(sys.stdin,1)]; print ''.join(lines)" < input.txt      
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

这种工作方式是将文本重定向到python的stdin中,并从那里读取行。enumerate()函数是给出行数(sys.stdin指定为输入)的函数,它1是起始索引。其余的很简单-我们通过将索引转换为与字符串连接在一起的' & '字符串和行本身来构成新字符串的列表。最后,所有由''.join()函数重新组合的列表将被重新组合成一个测试。

另外,这是脚本文件的多行版本,或者只是出于可读性考虑:

#!/usr/bin/env python
import sys

for index,line in enumerate(sys.stdin,1):
    print str(index) + ' & ' + line.strip()

原理相同:

$ ./line_counter.py  < input.txt                                                                                         
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

但是,如果您更喜欢用bash进行操作,那么也可以这样做:

$ counter=1; while read line ; do printf "%s & %s\n" "$counter" "$line" ; counter=$(($counter+1)) ; done < input.txt
1 & What & South Dragon & North Dragon    & 5 \ hline
2 & What & South Dragon & North Dragon    & 5 \ hline
3 & What & South Dragon & North Dragon    & 5 \ hline

1
@LéoLéopoldHertz준영好吧,如果我没有枚举就这样做,我将需要一个跟踪行数的变量,并且需要启动该变量并每次递增。使用enumerate()节省了3行代码。在处理其他事情(例如处理列表中的项目)时,此功能很有用。参见docs.python.org/2/library/functions.html#enumerate
Sergiy Kolodyazhnyy

@LéoLéopoldHertz준영如果您像我在bash示例中那样使用计数器,那么可以随意使用它:)我只是从经验中发现enumerate()更加优雅,但这只是我的看法。通过一切手段,用另一种方法,如果你认为它是更清晰
谢尔盖Kolodyazhnyy

OK,enumerate比变量实例更清晰。Lambda表达式可以节省一些空间吗?
莱奥波德·赫兹(LéoLéopoldHertz),2016年

@LéoLéopoldHertz준영它可以节省很长的脚本空间,但是在这种情况下,我只是看不到有什么帮助。
Sergiy Kolodyazhnyy

2

这也是cat -n与自动编号一起使用的选项:

while read num line;do echo $num "&" $line;done <<<$(cat -n a.txt)
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.