4

awk や sed などのツールを使用して、特定の方法でファイル内の行に番号を付けるためのより高速な方法を見つける必要があります。各行の最初の文字に、1、2、3、1、2、3、1、2、3 などのように番号を付ける必要があります。

たとえば、入力が次の場合:

line 1
line 2
line 3
line 4
line 5
line 6
line 7

出力は次のようになります。

1line 1
2line 2
3line 3
1line 4
2line 5
3line 6
1line 7

これが私が持っているものの一部です。$lines は、データ ファイルの行数を 3 で割った値です。したがって、21000 行のファイルの場合、このループを 7000 回処理します。

export i=0
while [ $i -le $lines ]
do
    export start=`expr $i \* 3 + 1`
    export end=`expr $start + 2`
    awk NR==$start,NR==$end $1 | awk '{printf("%d%s\n", NR,$0)}' >> data.out
    export i=`expr $i + 1`
done

基本的に、これは一度に 3 行を取得し、それらに番号を付けて、出力ファイルに追加します。それは遅いです...そして、いくつか!これを行うための別のより高速な方法を知りません...何か考えはありますか?

4

9 に答える 9

15

コマンドを試してくださいnl

https://linux.die.net/man/1/nl (または、「man nl」を Google で検索したときに表示されるドキュメントへの別のリンク、またはman nlシェル プロンプトで実行したときに表示されるテキスト バージョン)を参照してください。

nl ユーティリティは、指定されたファイルまたは file 引数が省略されている場合は標準入力から行を読み取り、構成可能な行番号付けフィルター操作を適用して、結果を標準出力に書き込みます。

編集:いいえ、違います。申し訳ありません。このnlコマンドには、行ごとに番号付けを再開するオプションはありませんn。パターンが見つかった後に番号付けを再開するオプションしかありません。誰かが について知るのに役立つかもしれないので、この回答をコミュニティ wiki の回答にしますnl

于 2008-12-08T20:12:25.030 に答える
9

同じ行を何度も読んでいるので遅いです。また、プロセスを起動しawkてシャットダウンし、別のプロセスを開始するだけです。すべてを1回で実行することをお勧めします。

awk '{print ((NR-1)%3)+1 $0}' $1 > data.out

番号の後にスペースを入れたい場合:

awk '{print ((NR-1)%3)+1, $0}' $1 > data.out
于 2008-12-08T20:19:40.990 に答える
2

Perlが思い浮かびます:

perl -pe '$_ = (($.-1)%3)+1 . $_'

動作するはずです。awk に相当するものがあることは間違いありません。基本的に、((line# - 1) MOD 3) + 1.

于 2008-12-08T20:09:43.757 に答える
2

これはあなたのために働くかもしれません:

 sed 's/^/1/;n;s/^/2/;n;s/^/3/' input
于 2011-11-21T23:55:00.143 に答える
1
awk '{printf "%d%s\n", ((NR-1) % 3) + 1, $0;}' "$@"
于 2008-12-08T20:19:36.263 に答える
1

Python

import sys
for count, line in enumerate(sys.stdin):
    stdout.write( "%d%s" % ( 1+(count % 3), line )
于 2008-12-08T20:23:54.413 に答える
1

これのために bash を離れる必要はありません:

i=0; while read; do echo "$((i++ % 3 + 1)) $REPLY"; done < input
于 2009-01-04T14:30:36.673 に答える
0

これで問題は解決するはずです。$_ 行全体を出力します。

awk '{print ((NR-1)%3+1) $_}' < input
1line 1
2line 2
3line 3
1line 4
2line 5
3line 6
1line 7

# cat input 
  line 1
  line 2
  line 3
  line 4
  line 5
  line 6
  line 7
于 2008-12-10T04:17:42.180 に答える