テキストファイルの各行に行番号とタブを追加するにはどうすればよいですか?


45

テキストファイルの各行の先頭に行番号とタブを追加するにはどうすればよいですか?


私が不思議に思っているのは、Windows上でそれをどうするかということです。
itsadok09年

4
これはstackoverflowにあるべきですか?スーパーユーザーの答えは、メモ帳と多くの忍耐です。
ココス2009

2
だから、前に追加するのか、追加するのか。タイトルと本文のテキストが異なります;)
matpie 09

冒頭付け加えたいと思うのですが、「prepend」はハッカーにとって単なる言葉です。
リチャードホスキンズ

Windowsでは、他のプログラミングに似た質問と同様に、Cygwinをインストールしてから以下の回答を使用できます。
ジョナサンハートリー

回答:


49
awk '{printf "%d\t%s\n", NR, $0}' < filename

10
またはawk '{print NR, "\t", $0}'
jtbandes 09

1
以下の答えは、nlコマンドラインで、はるかに簡単なソリューションです。
ダニエルリベイロ

2
@DanielRibeiroはシンプルですが、信頼性と柔軟性は劣ります。
ジョナサンハートリー

@DanielRibeiro使用する答えnlも間違っています。ソースコードでは、空白だけの行はカウントされないため、正しい行番号が表示されることはありません。
オリゴフレン

@jtbandesあなたのソリューションは行番号とタブの間にスペースを追加します(少なくとも私のMacでは)
Yossi Vainshtein

55

nlコマンドでこれを行う必要がありますが、行番号の前にもスペースが追加されます。Linux coreutilsの一部です。

nl lines.txt
 1  $bkWTN
 2  $cV8$.

4
実際、nl数字の前のスペースを省略するように指示できます。-w1オプションを使用して、数字の最小幅が1であることを伝えます。
cjm13年

2
「nl」は、デフォルトでは、テキストがヘッダーとフッターのある「ページ」に分割され、すべて「\:」または「\:\:」または「\:\:\:」などの行で区切られていることを前提としています。テキストにこのような行がある場合、 'nl'は、それらの行、番号付けのないセクションを飲み込む、セクションの1から番号付けを再開するなど、予期しない結果を生成します。この動作を防ぐには、-dXY(XYはテキスト内で単独で行に出現しない文字のペアです)を使用します。一般的な場合、これを予測するのは難しいかもしれないので、このページの他のソリューションのいずれかを使用することをお勧めします。
ジョナサンハートリー

「-w1」を使用すると、数字の後のスペースが削除されるだけでなく、行番号が1文字幅になるように切り捨てられます。つまり、行番号は最下位桁のみを表示します。これはほとんど間違いなくあなたが望むものではありません。
ジョナサンハートリー

4
では-nln、あなたがすることができますが、行番号の前にスペース(複数可)したくない場合は左揃え。また、タブを指定するには、セパレータあなたは使用することができます-s$'\t'-s' '(と単一引用符の間にタブを挿入しctrl+vた後tab)。
don_crissti

2
@JonathanHartley nl -w1(GNU coreutils 8.24より)は行番号を切り捨てませ
スキッピールグラングロウ

10
sed = test.txt | sed 'N;s/\n/\t/'

コマンド "sed ="は、行番号に続いて復帰と次の行を出力します。

式「N; s / \ n / \ t /」は各行を取得し、次の行(行番号と行)を取得し、キャリッジリターンをタブに置き換えます。


sedの私のバージョンとなしタブで「t」を印刷します:私は、ヒステリックな裸を飢え、9トン狂気によって破壊された私の世代の最高の心を見た8トン
リチャード・ホスキンス

1
これ\nはラインフィードであり(Unixで最初に広く使用されていたため、一般に単に「改行」と呼ばれます)、改行\rです。Windowsが使用します\r\n(とも呼ばれますCRLF)。
カミロマーティン14

(ええと!)
カミロマーティン14

ウィンドウがどのように異なる可能性があるのか​​を慎重に検討する場合は、UTF16を考慮する必要があります。
mc0e

4
cat -n <yourfile> | perl -pe "s/^\s*(\d+)\s+/\1\t/"

cat -nは、行番号を「123 linecontents」として追加し、その正規表現はそれを「linenumberTABlinecontents」に変更します


3
perl -pe "s/^/$.\t$_/" file.txt

または

perl -ne "print qq($.\t$_)" file.txt

2

どう?

cat -n somefile.txt


1
タブなし。(15文字を必要とするコメントは愚かな要件です。)
リチャード

1
これにより、システムにタブが作成されます。cat(GNU coreutils)6.10。
インナ2009

私のシステムでは、(tab)number(space)lineが追加されます。BSD Utils。
リチャード

2

OK、1行のbashソリューションを次に示します。

$ IFS=$'\n';x=1;for l in $(<file.txt);do echo -e "$x\t$l";((x+=1));done
$ IFS=

最初のIFS設定は、bashに一度に1行ずつ読み取るように指示します。2行目は、IFSをデフォルトにリセットします。

追加のボーナスとして、シェルで完全に実行され、プログラムを実行しません!


1

OK、これを行う方法を集めているので、

 grep -n . file.txt | sed 's/\(^[0-9]*\):/\1    /g'
 # this is a tab with Ctrl-V + Tab  =====>  ---- 

今、私はこれを見ます。OK、自分の投稿を削除します。何?SUが自分の投稿を削除させないということですか?
ケビンM

grep + sed == awk
Tadeusz A.Kadłubowski09年

1
sed file.txt -e 's/^/\t/' | cat -n | sed -e 's/^\t//'

またはいくつかの非GNU sedの場合:

cat file.txt | sed -e 's/^/\\t/' | cat -n | sed -e 's/^\\t//'

私のバージョンのsedでタブなしで「t」を出力します。
リチャードホスキンズ

二重エスケープに編集されました。そのようにしてみてください。
カオス

他のすべてが失敗した場合は、タブを押してください。:)(またはシェルで問題が発生した場合は^ Vタブ。)
カオス

sed:1: "test.txt":未定義のラベル 'est.txt'
リチャード

'cat test.txt | sed -e 's / ^ / \\ t /' | cat -n 'prints(tab)number(space)\ t(line)
Richard Hoskins
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.