使用awk将列附加到文件

时间:2013-02-07 15:14:08

标签: awk

我有一个很长的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并将其打印到同一个文件中?

2 个答案:

答案 0 :(得分:4)

您可能遇到的问题是,每当awk修改字段时,它都会重写您的$0,用OFS替换IFS。如果您的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行摆弄你的间距。

答案 1 :(得分:1)

如果是格式化问题,请通过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