使用awk向文件追加列

使用awk向文件追加列,awk,Awk,我有一个有点长的awk脚本,我想在文件的“右侧”附加两列。我正在处理以下文件: Node temporary_Temperature steady_Temperature temporary_Sight steady_Sight 1 x x - - 2 x

我有一个有点长的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迭代该文件中的行,比如说,再附加两列。在标题行中,我想附加列
foo
bar
,然后根据其他内容将
x
-
附加到每一行。我怎样才能做到这一点?因为我在一个较长的脚本中间,我不想使用SED,除非有某种方法从AWK脚本中调用SED,打印到同一个文件中。

< P>您可能面临的问题是每当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
中包含的两个条件设置变量

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


您可能需要修改第1行的间距。

如果是格式问题,请通过管道将输出通过
列-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

谢谢你的详细解释;我的awk技能提高了!我的问题实际上比我在工作日结束时所能描述的要复杂一些。我正在迭代fileA并打印到fileB(fileB显示在OP中)。然后我想迭代fileC并将结果列从那里打印到文件B。实际上,我最终打印了两个文件,并使用
粘贴fileA fileC>fileB
,然后删除文件A和文件C。虽然不太漂亮,但它可以工作。如果您对这种方法有任何意见,我将不胜感激,同时也接受您的回答,因为它回答了我最初的(描述不好的)问题。
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