【问题标题】:print specific field from first line in file using awk使用 awk 从文件的第一行打印特定字段
【发布时间】:2013-02-04 22:30:28
【问题描述】:

我有一个文件 (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;
}

【问题讨论】:

    标签: awk line field


    【解决方案1】:

    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
    

    【讨论】:

    • 太棒了,将 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 首次登录:2 月 13 日 2:43 结束登录:2 月 14 日 8:47
    • @FredLohrman:使用变量来存储你想要的东西。然后在需要时打印它们。我已经更新了上面的答案。 HTH。
    • 第一种方式只是打印出空白点,我不能使用第二种方式,因为我需要 First Login 和 Last Login 都在 END{} 感谢您的帮助!
    • 由于我使用的是脚本文件,因此我可能需要以不同的方式输入。我知道在使用脚本文件时我显然没有把“awk”放在前面,但是我还有什么需要改变的吗?首次登录时仍然出现空白。也还是不能并排放置。
    • @FredLohrman:两件事:1)你写了NF==1而不是NR==1。 2) 设置一个OFS 而不必一遍又一遍地写出"\t\t"。默认情况下,FSOFS 都返回一个空格。当您在打印语句中使用逗号时,它们本质上是OFS。 HTH。
    【解决方案2】:
    awk 'NR==1{x="First Login "$1FS$2FS$3;}END{x=x" last Login "$1FS$2FS$3;print x}' your_file
    

    测试here

    【讨论】:

      【解决方案3】:

      尝试在最后一次登录时使用变量,因为不是每个 awk 都保留 END 部分中的字段值。例如:

      awk '{l=$1 FS $2 FS $3} NR==1{f=l} END{ print "First login: " f; print "Last login: " l}' infile
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-07
        • 2017-06-02
        • 2022-06-10
        • 2015-02-11
        • 2014-06-24
        • 2022-01-05
        • 2011-04-11
        • 2013-03-17
        相关资源
        最近更新 更多