Linuxは、各文字列の前に特定の数字が表示される回数を計算します。

Linuxは、各文字列の前に特定の数字が表示される回数を計算します。

私はこのファイルを持っています:

90  1 
120 1
Transition  
150 1
Transition  
165 1
Transition  
180 1
225 1
240 1
255 1
270 1
Transition  
285 1
Transition  

私は次のような出力が欲しい。

1   2
2   1
3   1
4   5
5   1

つまり、1最初の変換の前に2番目の列が2回表示されます。これにはawk / grepをどのように使用しますか?

答え1

1各行の前/間の2番目のフィールドで回数を計算するには、次のようにTransition使用できます。awk

awk '$2 == "1" {count++;} /Transition/ {t_count++; print t_count "\t" count; count=0;}' <input file>

1フィールド 2 でカウンターがインクリメントされ、行が一致するたびに、変換されたTransition行数の数が印刷され、続いて行1数が印刷されます。

私の入力ファイルの出力:

1       2
2       1
3       1
4       5
5       1

答え2

以下はPerlソリューションの使用です。エリック・レノフ答え:

$ perl -lane '$F[1]==1 && $c++; if(/Transition/){$k++; print "$k\t$c"; $c=0}' file
1   2
2   1
3   1
4   5
5   1

説明する

  • -l各呼び出しに改行を追加しますprint
  • -a「awk-mode」を有効にし、各入力ラインを配列に分割して最初のフィールドと2番目のフィールドになるようにします@F$F[0]$F[1]
  • -neperl入力ファイルを1行ずつ処理し、与えられたスクリプトを各行に適用するように指示します-e
  • $F[1]==1 && $c++;$c2番目のフィールドがある場合は1を追加します1
  • if(/Transition/){$k++; print "$k\t$c"; $c=0}': 行が一致した場合は、1 つを追加し、合計の現在の値をTransition印刷してから 0 に戻します。$k$k$c$c

答え3

「転換」と「数字の後ろに1」以外の行がありますか?私はそうではないと仮定しています。間に遷移なしで2つの遷移がある場合はどうなりますか?私はこれが起こらないと仮定しています。

特にawkを要求したので、Ericの答えは完璧です。完全性のためにawkのないバージョンを提出したいです:)

| sed 's/.* 1 *$/CountThisLine/' | uniq -c | sed -n 's/CountThisLine//p' | nl -nln

最初はsed計算する行を選択し、変換を維持しながら同じにし、uniq -c同じ連続行を計算し、2番目はsed変換されていない行のみを維持し、nl結果に番号を付けます。

$ cat test.txt \
  | sed 's/.* 1 *$/CountThisLine/' \
  | uniq -c \
  | sed -n 's/CountThisLine//p' \
  | nl -nln
1             2 
2             1 
3             1 
4             5 
5             1 

関連情報