0

以下の形式でいくつかの月次統計を取得します。必要なことは、各列の最小値と最大値をawk取得することです。このスクリプトを使用して、はるかに大きなファイルからテーブルを取得するために既に使用しています

awk 'c-->3;/By Day/{c=35; print}' file1.txt

出力を取得します。

日ごとに:

 Separate user logon counts-(max sessions)-(external counts)-(lock actions):
 2013/04/07 -      6    (   6)  (  37)  (   0)
 2013/04/08 -    190    (  70)  (6528)  (  30)
 2013/04/09 -    185    (  68)  (5986)  (  29)
 2013/04/10 -    213    (  85)  (5571)  (  36)
 2013/04/11 -    189    (  82)  (5410)  (  35)
 2013/04/12 -    165    (  69)  (5130)  (  25)
 2013/04/13 -     16    (  15)  ( 662)  (   0)
 2013/04/14 -     20    (  14)  (1016)  (   2)
 2013/04/15 -    160    (  64)  (6770)  (  39)
 2013/04/16 -    205    (  96)  (5978)  (  25)
 2013/04/17 -    197    (  83)  (5816)  (  37)
 2013/04/18 -    167    (  78)  (5554)  (  38)
 2013/04/19 -    152    (  71)  (5479)  (  29)
 2013/04/20 -     18    (  10)  ( 578)  (   1)
 2013/04/21 -     11    (   7)  (1018)  (   2)
 2013/04/22 -    193    (  74)  (6931)  (  30)
 2013/04/23 -    176    (  66)  (6184)  (  23)
 2013/04/24 -    192    (  74)  (5891)  (  26)
 2013/04/25 -    188    (  79)  (5575)  (  28)
 2013/04/26 -    170    (  75)  (5513)  (  26)
 2013/04/27 -     17    (  12)  ( 597)  (   0)
 2013/04/28 -     17    (  10)  (1021)  (   0)
 2013/04/29 -    193    (  79)  (6786)  (  38)
 2013/04/30 -    217    (  87)  (6094)  (  36)
 2013/05/01 -    185    (  82)  (5706)  (  32)
 2013/05/02 -    188    (  76)  (5602)  (  29)
 2013/05/03 -    167    (  63)  (5149)  (  21)
 2013/05/04 -     22    (  14)  ( 634)  (   1)
 2013/05/05 -     21    (  14)  ( 728)  (   1)
 2013/05/06 -      2    (   8)  (  46)  (   0)

awk設定された列で並べ替え、並べ替えられた列と最初の列のみを表示するようにスクリプトを編集できますか?

4

2 に答える 2

0

あなたのスクリプトが偶然にプログラミングされていると確信しています。現状では、変数をデクリメントcし、入力のすべての行で 3 より大きいかどうかをテストします。結果に応じて、デフォルトのブロックが実行されるため、行が出力されます。2 番目のブロックは、次を含む行と一致するため役に立たないように見えBy Dayますが、入力には単一の一致が含まれていますか? 現状ではc、デクリメントのみとして 0 として初期化されます。つまり、条件c-->3が真になることは決してないため、このスクリプトは現在の入力で何も出力しません!?

awk 'c-->3;/By Day/{c=35; print}' file1.txt

このスクリプトを書き直す方法については、元のファイルを投稿してください。


スクリプトを無視しawkて現在の入力を取得すると、括弧を削除してsort. たとえば、5 番目の列で数値の並べ替えを行うには、次のようにします。

$ sed 's/[()]//g' file | sort -nk5 | awk '{print $1,$5}'
Separate sessions-external
2013/04/07 37
2013/05/06 46
2013/04/20 578
2013/04/27 597
2013/05/04 634
2013/04/13 662
2013/05/05 728
2013/04/14 1016
2013/04/21 1018
2013/04/28 1021
2013/04/12 5130
2013/05/03 5149
2013/04/11 5410
2013/04/19 5479
2013/04/26 5513
2013/04/18 5554
2013/04/10 5571
2013/04/25 5575
2013/05/02 5602
2013/05/01 5706
2013/04/17 5816
2013/04/24 5891
2013/04/16 5978
2013/04/09 5986
2013/04/30 6094
2013/04/23 6184
2013/04/08 6528
2013/04/15 6770
2013/04/29 6786
2013/04/22 6931

編集:

あなたが持っている場合、試合の3行前に試合の後に35を印刷する最も簡単な方法GNU grep

grep -A35 -B3 'By Day' file

次に、数値並べ替えオプションを使用してパイプで並べ替え-n、列を指定し、またはを-k使用して必要な列のみを取得します。 cutawk

于 2013-05-15T10:22:05.727 に答える
0

「By Day」を含む行とそれに続く 35 行を印刷する正しい方法は次のとおりです。

awk '/By Day/{c=36} c&&c--' file1.txt

ここで、代表的な入力 (いいえ、35 行である必要はありません。5 行以下にします) と、その入力から期待される出力を投稿してください。次に何をしたいのかを確認できます。

「By Day」の前の3行も印刷したいというコメントがありました。それ自体は次のようになります。

awk '
/By Day/{
    for (i=0;i<3;i++) {
        j=(NR+i)%3
        if (j in buf) {
            print buf[j]
        }
    }
}
{ buf[NR%3]=$0 }
' file

これらを次のように組み合わせることができます。

awk -v pre=3 -v post=35 '
/By Day/{
    for (i=0;i<pre;i++) {
        j = (NR+i) % pre
        if (j in buf) {
            print buf[j]
        }
    }
    c = post + 1
}
{ buf[NR%pre]=$0 }
c&&c--
' file
于 2013-05-15T12:32:14.597 に答える