我有一个文件(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 with print statements
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;
}
答案 0 :(得分: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
是行数的缩写。见here。 HTH。
的 EDIT1:强> 的
根据您的风格,这有两种方式。第一个被认为更正确:
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
答案 1 :(得分:0)
awk 'NR==1{x="First Login "$1FS$2FS$3;}END{x=x" last Login "$1FS$2FS$3;print x}' your_file
测试here
答案 2 :(得分:0)
还尝试使用变量进行上次登录,因为并非每个awk都保留END部分中的字段值。例如:
awk '{l=$1 FS $2 FS $3} NR==1{f=l} END{ print "First login: " f; print "Last login: " l}' infile