4

このようなファイルがあります

file.txt

0   1   a
1   1   b
2   1   d
3   1   d
4   2   g
5   2   a
6   3   b
7   3   d
8   4   d
9   5   g
10   5   g
.
.
.

awk または bash スクリプトを使用して$1、2 列目のフィールドの値が変更されるたびに、最初の列の行番号カウントを 0 にリセットします。$2

結果

0   1   a
1   1   b
2   1   d
3   1   d
0   2   g
1   2   a
0   3   b
1   3   d
0   4   d
0   5   g
1   5   g
.
.
. 
4

4 に答える 4

9

少し余分なメモリ使用量を気にせず、2 番目の列がソートされている限り、これが最も楽しいと思います。

awk '{$1=a[$2]+++0;print}' input.txt
于 2012-10-23T01:14:49.137 に答える
6

この awk ワンライナーは私にとってはうまくいくようです:

[ghoti@pc ~]$ awk 'prev!=$2{first=0;prev=$2} {$1=first;first++} 1' input.txt
0 1 a
1 1 b
2 1 d
3 1 d
0 2 g
1 2 a
0 3 b
1 3 d
0 4 d
0 5 g
1 5 g

スクリプトを分解して、その機能を見てみましょう。

  • prev!=$2 {first=0;prev=$2}-- これは、カウンターをリセットするものです。の初期状態prevは空であるため、入力の最初の行でリセットしますが、これで問題ありません。
  • {$1=first;first++}-- すべての行について、最初のフィールドを設定し、最初のフィールドを設定するために使用している変数をインクリメントします。
  • 1-- これは awk の「print the line」の省略形です。これは実際には常に「true」と評価される条件であり、条件/ステートメントのペアにステートメントがない場合、ステートメントはデフォルトで「print」になります。

本当に基本的なことです。

もちろん、1 つのキャッチは、awk の任意のフィールドの値を変更すると、設定されているフィールド セパレータを使用して行が書き換えられることです。これは、デフォルトでは単なるスペースです。これを調整したい場合は、OFS変数を設定できます。

[ghoti@pc ~]$ awk -vOFS="   " 'p!=$2{f=0;p=$2}{$1=f;f++}1' input.txt | head -2
0   1   a
1   1   b

味に塩。

于 2012-10-22T23:41:16.870 に答える
2

純粋なソリューション:

file="/PATH/TO/YOUR/OWN/INPUT/FILE"

count=0
old_trigger=0

while read a b c; do
    if ((b == old_trigger)); then
        echo "$((count++)) $b $c"
    else
        count=0
        echo "$((count++)) $b $c"
        old_trigger=$b
    fi

done < "$file"

このソリューション(IMHO)には、読み取り可能なアルゴリズムを使用できるという利点があります。私は他の人が答えとして与えるものは好きですが、それは初心者にとってそれほど包括的ではありません.

:

((...))式がゼロ以外の場合は終了ステータス 0 を返し、式がゼロの場合は 1 を返す算術コマンドです。let副作用 (割り当て) が必要な場合は、 の同義語としても使用されます。http://mywiki.wooledge.org/ArithmeticExpressionを参照してください。

于 2012-10-22T23:45:16.287 に答える
0

Perl ソリューション:

perl -naE '
    $dec  =  $F[0] if defined $old and $F[1] != $old;
    $F[0] -= $dec;
    $old  =  $F[1];
    say join "\t", @F[0,1,2];'

$dec毎回最初の列から減算されます。2 番目の列が変更されると (以前の値は に格納されます$old)、$decが増加して、最初の列が再びゼロに設定されます。最初のdefined行が機能するには、条件が必要です。

于 2012-10-22T23:14:53.533 に答える