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