AWK /…による行頭置換の行カウンターをインクリメントする方法


9

私は最初にSED(sed "s/^/COUNTER \&/" /tmp/1.tex)について考えましたが、それは単一の行用に設計されてawkおりgawk、統合アプローチでの素晴らしい経験があるため、今はsedでカウンター自体をインクリメントできません。データ

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

回答:


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

これを前置カウンターとアンパサンドとどのように組み合わせることができますか?--カウンターに対しては機能しますが、カウンターに対しても機能します。
レオ・レオポルド・ヘルツ준 영

3
nl -s ' &' /path/to/file-s数値と入力ファイルの本文を区切るものを指定します。
DopeGhoti 16

1
nlとは異なり、デフォルトでは空の行に番号を付けないcat -nというawk解決策
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 | ...か?--sed with equalsymbol が使えることを知りませんでした。-- sedステートメントは動的環境で機能しますか?弱点はありますか?
レオ・レオポルド・ヘルツ준 영

1
@LéoLéopoldHertz준영マニュアルページの下を見て、=演算子は「ゼロまたは1アドレスコマンド」セクションの下にあります。
Sergiy Kolodyazhnyy 2016

はい、= 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()functionは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

1
@LéoLéopoldHertz준영ええと、列挙せずにそれを行う場合は、行数を追跡する変数が必要であり、その変数を開始して毎回インクリメントする必要があります。を使用enumerate()すると、3行のコードを節約できます。リスト内のアイテムの処理など、他のものを処理するときに役立ちます。docs.python.org/2/library/functions.html#enumerate
Sergiy Kolodyazhnyyを

@LéoLéopoldHertz준영私がbash例のようにカウンターを使用することを理解している場合は、それを自由に使用してください:)私は経験enumerate()からよりエレガントであることがわかりましたが、それは単なる私の意見です。あなたはそれがより明確だと思う場合は、すべての手段によって、他の方法を使用する
Sergiy Kolodyazhnyyを

OK、enumerate変数のインスタンス化よりも明確です。ラムダ式でスペースを節約できますか?
レオ・レオポルド・ヘルツ준 영

@LéoLéopoldHertz준영長いスクリプトではスペースを節約できますが、この場合、それがどのように役立つかわかりません。
Sergiy Kolodyazhnyy 2016

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.