![如何增加 AWK/... 行开头替换的行计数器?](https://linux22.com/image/101747/%E5%A6%82%E4%BD%95%E5%A2%9E%E5%8A%A0%20AWK%2F...%20%E8%A1%8C%E5%BC%80%E5%A4%B4%E6%9B%BF%E6%8D%A2%E7%9A%84%E8%A1%8C%E8%AE%A1%E6%95%B0%E5%99%A8%EF%BC%9F.png)
我首先想到了 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)