【问题标题】:Appending columns to a file using awk使用 awk 将列附加到文件
【发布时间】:2013-01-23 03:37:56
【问题描述】:

我有一个有点长的 awk 脚本,我想在文件的“右侧”附加两列。我正在处理以下文件:

Node    temporary_Temperature   steady_Temperature  temporary_Sight steady_Sight    
1                   x                   x                   -                   -                   
2                   x                   x                   -                   -                   
3                   -                   -                   -                   -                   
4                   -                   -                   -                   -                   
5                   x                   x                   x                   -                   
6                   -                   -                   -                   -                   
7                   -                   -                   -                   -                   
8                   -                   -                   -                   -                   
9                   -                   -                   -                   -                   
10                  -                   -                   -                   -                   
11                  -                   -                   -                   -                   
12                  -                   -                   -                   -                   
13                  x                   x                   -                   -                   
14                  x                   x                   -                   -                   
15                  x                   -                   -                   -                   
16                  -                   -                   -                   -                   

数据已写入文件,我想使用 awk 迭代该文件中的行,假设再追加两列。在标题行,我想附加列foobar,然后根据其他内容将x- 附加到每一行。我怎样才能做到这一点?由于我在一个较长的脚本中间,我不想使用 sed,除非有某种方法可以从 awk 脚本中调用 sed 并打印到同一个文件?

【问题讨论】:

    标签: awk


    【解决方案1】:

    您在这里可能面临的问题是,每当 awk 修改字段时,它都会重写您的 $0,将 IFS 替换为 OFS。如果您的 FS 是“任意数量的空格”(默认 FS),并且它被替换为“空格”(默认 OFS),则会丢失格式。

    演示:

    [ghoti@pc ~]$ printf 'one    two\tthree\n'
    one    two      three
    [ghoti@pc ~]$ printf 'one    two\tthree\n' | awk '{$4 = "four"} 1'
    one two three four
    

    如果您真的不想修改每一行的 字段,而只想附加一个字符串,则无需重写字段分隔符即可:

    [ghoti@pc ~]$ printf 'one    two\tthree\n' | awk '{print $0 "\tfour"}'
    one    two      three   four
    

    没有看到您的脚本或您要附加的数据类型,我很难提供我知道适用于您的情况的具体示例,但这里有一个示例可以帮助您入门:

      NR == 1 {
        print $0 "\tfoo\tbar";
        next;
      }
      {
        print $0 "\t" (conditionone ? "x" : "-") "\t" (conditiontwo ? "x" : "-");
      }
    

    如果您在制定条件时需要帮助,请将其包含在您的问题中。我在上面的代码中使用了短格式;您显然可以使用printf() 将内容分开并进行多行打印,或者根据要包含在print 中的两个条件设置变量。

    作为替代方案,您可以在浏览输入数据时重新进行格式化。例如(假设您问题中的尾随空格确实是您的输入文件的样子):

    BEGIN {
      fmt="%-20s%-20s%-20s%-20s%-20s%-20s%s\n";
    }
    
    NR == 1 {
      printf("%s%12s%-20s%-20s\n", $0, " ", "foo", "bar");
      next;
    }
    
    { foo="-"; bar="-"; }
    
    conditionone { foo="x"; }
    conditiontwo { bar="x"; }
    
    {
      printf(fmt, $1, $2, $3, $4, $5, foo, bar);
    }
    

    您可能不得不在第 1 行调整间距。

    【讨论】:

    • 感谢您的详尽解释;我的awk技能提高了!我的问题实际上比我在工作日结束时设法描述的要复杂一些。我正在迭代 fileA 并打印到 fileB(fileB 显示在 OP 中)。然后我想迭代 fileC 并将一些结果列从那里打印到文件 B。实际上我最终打印了两个文件并使用 paste fileA fileC > fileB 然后删除文件 A 和文件 C。不是很漂亮,但它可以工作。我会很感激这种方法的任何 cmets,并且也接受你的回答,因为它回答了我原来的(描述不佳的)问题。
    【解决方案2】:

    如果是格式问题,请通过column -t 管道输出

    例子:

    awk '
        NR==1 {print $0, "foo", "bar"; next} 
        {print $0, ($2=="x"?"-":"x"), ($4=="x"?"-":"x")}
    ' file | column -t
    

    输出

    Node  temporary_Temperature  steady_Temperature  temporary_Sight  steady_Sight  foo  bar
    1     x                      x                   -                -             -    x
    2     x                      x                   -                -             -    x
    3     -                      -                   -                -             x    x
    4     -                      -                   -                -             x    x
    5     x                      x                   x                -             -    -
    6     -                      -                   -                -             x    x
    7     -                      -                   -                -             x    x
    8     -                      -                   -                -             x    x
    9     -                      -                   -                -             x    x
    10    -                      -                   -                -             x    x
    11    -                      -                   -                -             x    x
    12    -                      -                   -                -             x    x
    13    x                      x                   -                -             -    x
    14    x                      x                   -                -             -    x
    15    x                      -                   -                -             -    x
    16    -                      -                   -                -             x    x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多