私はこのファイルを持っています:
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]
-ne
perl
入力ファイルを1行ずつ処理し、与えられたスクリプトを各行に適用するように指示します-e
。$F[1]==1 && $c++;
:$c
2番目のフィールドがある場合は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