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

现在请记住,我正在使用一个 .awk 文件,其中包含我的所有 awk 语句,它执行 logins.txt 并使用我想要打印的内容创建一个不同的文件。

最后一次登录很容易。我只是简单地说:

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

这是我的 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。


编辑1:

这里有两种方法,取决于你的风格。第一个会被认为更正确:

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

编辑2:

像这样运行你的脚本:

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
}

编辑3:

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 '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 回答
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 回答