web-dev-qa-db-ja.com

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

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
11
DopeGhoti

これはあなたが求めているものを実現します。 (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
10
steve

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
_
3

これは、自動番号付けでcat -nを使用するオプションでもあります。

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