【问题标题】:awk problems remembering previous lineawk 记住上一行的问题
【发布时间】:2017-07-17 20:36:10
【问题描述】:

我有以下 awk 文件;

BEGIN { FS=":" };
{if (NR%2==1) { host=$1 }};
{if (NR%2==0) { print $host ":" $0 }};

我想做以下事情;

如果第 # 行是奇数,则存储第一个字段。

如果第 # 行是偶数,则打印之前存储的字段、冒号以及当前行。

目前这会输出偶数行两次 "evenline:evenline"

不知道我做错了什么。

【问题讨论】:

    标签: awk


    【解决方案1】:

    应该是:

    BEGIN { FS=":" };
    {if (NR%2==1) { host=$1 }};
    {if (NR%2==0) { print host ":" $0 }};
    

    $host -> host.


    为什么?

    awk 中的字段名称以美元开头$ 前面。您可以像$1$2 等静态访问awk 中的字段,也可以像$variable 那样动态访问。当用于字段名称时,变量将被转换为整数,因为awk 中的字段名称是数字。变量host 包含一个字符串,该字符串将被转换为0。这使得awk 打印$0 两次。


    请注意,您可以简化:

    BEGIN { FS=":" }
    NR%2==1 { host=$1 };
    NR%2==0 { print host ":" $0 }
    

    【讨论】:

    • 哦,ffs 谢谢!!
    • 【厚脸皮】也可以写成BEGIN {FS=":"}; NR%2 {printf "%s:", $1; next}; 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多