9

次のような入力ファイルがあります (最初の列は場所番号で、2 番目の列は時間の経過とともに増加するカウントです)。

1       0
1       2
1       6
1       7
1       7
1       8
1       7
1       7
1       9
1       9
1       10
1       10
1       9
1       10
1       10
1       10
1       10
1       10
1       10
1       9
1       10
1       10
1       10
1       10
1       10
1       10

そして、次のように修正したいと思います(前のカウントで減少した代替カウント):

1       0
1       2
1       6
1       7
1       7
1       8
1       8
1       8
1       9
1       9
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10
1       10

私はこれに awk を使用しようとしていますが、行番号 (NR?) をリセットする方法がわからないため、getline でつまずいています。そのため、各行が読み取られ、2 行ではなく次の行になります。一度に。これは私がこれまでに持っているコードですが、何かアイデアはありますか?

awk '{a=$1; b=$2; getline; c=$1; d=$2; if (a==c && b<=d) print a"\t"b; else print c"\t"d}' original.txt > fixed.txt

また、これは私が現在得ている出力です:

1       0
1       6
1       7
1       7
1       9
1       10
1       9
1       10
1       10
1       9
1       10
1       10
1       10
4

2 に答える 2

8

おそらくあなたが望むのは:

awk '$2 < p { $2 = p } { p = $2 } 1' input-file

2 番目の列の値が負の場合、これは最初の行で失敗するため、次のようにします。

awk 'NR > 1 && $2 < p ...'

これは、現在の値が小さい場合に 2 番目の列を前の値に設定し、現在の値を変数 p に格納して、行を出力します。

これにより、変更された行の出力の間隔もわずかに変更されることに注意してください。入力がタブ区切りの場合は、次のことを実行できます。

awk 'NR > 1 && $2 < p { $2 = p } { p = $2 } 1' OFS=\\t input-file
于 2012-07-28T21:43:27.350 に答える
2

このスクリプトはあなたが好きなことをします:

{
  if ($2 < prev_count)
    $2 = prev_count
  else
    prev_count = $2

  printf("%d   %d\n", $1, $2)
}

これは、読みやすくするための冗長バージョンです:)

于 2012-07-28T21:47:06.967 に答える