最初に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
OS:Debian 8.5
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
これはあなたが求めているものを実現します。 (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
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()
関数によってリストから1つのテストに再構成されます。
または、スクリプトファイルまたは単に読みやすくするための複数行バージョンを次に示します。
_#!/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
_
これは、自動番号付けでcat -n
を使用するオプションでもあります。
while read num line;do echo $num "&" $line;done <<<$(cat -n a.txt)