如何增加 AWK/... 行开头替换的行计数器?

如何增加 AWK/... 行开头替换的行计数器?

我首先想到了 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

答案1

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

答案2

这实现了你所追求的。 (就像一样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

答案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 的标准输入,并从那里读取行。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

答案4

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

while read num line;do echo $num "&" $line;done <<<$(cat -n a.txt)

相关内容