4

最初と最後のログイン日時と最終ログイン日時のみを表示するファイルにする必要があるファイル (logins.txt) があります。logins.txt は次のようになります。

Feb 13 2:43 (login IP)
Feb 13 2:48 (login IP)
Feb 13 5:23 (login IP)
Feb 13 9:43 (login IP)
Feb 14 1:34 (login IP)
Feb 14 8:42 (login IP)
Feb 14 8:47 (login IP)

印刷したい:

First Login: Feb 13 2:43
Last Login: Feb 14 8:47

ここで、 logins.txt を実行し、印刷したいもので別のファイルを作成する awk ステートメントがすべて含まれている .awk ファイルを使用していることに注意してください。

前回のログインは簡単でした。私は単に置く:

END{
print "$1, $2, $3";
}

これらのフィールドの最後の出現を出力します。しかし、どうすれば最初の出現でそれを行うことができますか?

編集: すごい、NR==1 を入れるとうまくいきますが、印刷したい他のものの下に必要なので、これを END フィールドに入れる必要があります。すべての下に置くにはどうすればよいですか?また、次のように印刷したい:

Blah blah blah blah blah blah blah blah
Blah blah blah blah blah blah blah blah
Blah blah blah blah blah blah blah blah
First Login: Feb 13 2:43      Last Login: Feb 14 8:47

これがprintステートメントを含む私のENDです

NF==1 {a=$1; b=$2; c=$3;}

END{
   print "Feed\t\t\tAccepted\tRejected\tCanceled";
   print "-----------------------------------------------------------------";
   print "swrinde:\t\t", accepted_sw"\t\t", rejected_sw"\t\t", canceled_sw"\t\t";
   print "news.cais.net:\t\t", accepted_ne"\t\t", rejected_ne"\t\t", canceled_ne"\t\t";
   print "\?:\t\t\t", accepted_un"\t\t", rejected_un"\t\t", canceled_un"\t\t";
   print "\nStart Time = ", a, b, c RS "\tEnd Time =", $1, $2, $3;
}
4

3 に答える 3

12

NR==1別のブロックを次のように修飾します。

awk 'NR==1 { print "First Login:", $1, $2, $3 } END { print "Last Login:", $1, $2, $3 }' logins.txt

結果:

First Login: Feb 13 2:43
Last Login: Feb 14 8:47

NR行数の略です。ここを参照してください。HTH。


EDIT1:

スタイルに応じて、2 つの方法があります。最初のものはより正しいと考えられます:

awk 'NR==1 { a=$1; b=$2; c=$3 } { print "Blah" } END { print "First Login:", a, b, c  RS "Last Login:", $1, $2, $3 }' logins.txt

awk 'NR==1 { x=("First Login:" FS $1 FS $2 FS $3) } { print "Blah" } END { print x RS "Last Login:", $1, $2, $3 }' logins.txt

結果:

Blah
Blah
Blah
Blah
Blah
Blah
Blah
First Login: Feb 13 2:43
Last Login: Feb 14 8:47

EDIT2:

次のようにスクリプトを実行します。

awk -f script.awk logins.txt

の内容script.awk:

NR==1 {
    a=$1
    b=$2
    c=$3
}

{
    print "Blah"
}

END {
    print "First Login:", a, b, c  RS "Last Login:", $1, $2, $3
}

EDIT3:

BEGIN { OFS="\t\t" }

NR==1 { a=$1; b=$2; c=$3 }

END{
   print "Feed\t\t\tAccepted\tRejected\tCanceled"
   print "-----------------------------------------------------------------"
   print "swrinde:", accepted_sw, rejected_sw, canceled_sw
   print "news.cais.net:", accepted_ne, rejected_ne, canceled_ne
   print "?:\t", accepted_un, rejected_un, canceled_un

   print "Start Time = " a FS b FS c
   print "End Time = " $1 FS $2 FS $3
}

結果:

Feed            Accepted    Rejected    Canceled
-----------------------------------------------------------------
swrinde:                        
news.cais.net:                      
?:                          
Start Time = Feb 13 2:43
End Time = Feb 14 8:47
于 2013-02-20T02:06:42.263 に答える
0

すべての awk が END セクションのフィールド値を保持しているわけではないため、最後のログインにも変数を使用してみてください。例えば:

awk '{l=$1 FS $2 FS $3} NR==1{f=l} END{ print "First login: " f; print "Last login: " l}' infile
于 2013-02-20T15:14:20.493 に答える
0
awk 'NR==1{x="First Login "$1FS$2FS$3;}END{x=x" last Login "$1FS$2FS$3;print x}' your_file

ここでテスト

于 2013-02-20T06:19:07.853 に答える