如何使用'awk',以便我只能有条件地更改行中的一个或两个字段?

如何使用'awk',以便我只能有条件地更改行中的一个或两个字段?,awk,Awk,我有一个选项卡分隔的文件,有16个字段。我是否可以使用awk有条件地更改一个或多个字段,并将整行打印为输出?e、 例如,根据第一个字段中的值,我想说在字段4中添加一个特定的数字,依此类推。但作为输出,我必须打印整行。如果是,我想知道怎么做 是的。这是一个使用示例(可能不是最聪明的): 有关更多信息,请参阅man awk或一些在线教程(有很多)。这个如何(文件示例取自@etuardu)- awk'{if($1==“ALTER”){$5=$5+1;打印“\n”;对于(i=1;i是的,这里有一种方法:

我有一个选项卡分隔的文件,有16个字段。我是否可以使用
awk
有条件地更改一个或多个字段,并将整行打印为输出?e、 例如,根据第一个字段中的值,我想说在字段4中添加一个特定的数字,依此类推。但作为输出,我必须打印整行。如果是,我想知道怎么做

是的。这是一个使用示例(可能不是最聪明的):

有关更多信息,请参阅
man awk
或一些在线教程(有很多)。

这个如何(文件示例取自@etuardu)-


awk'{if($1==“ALTER”){$5=$5+1;打印“\n”;对于(i=1;i是的,这里有一种方法:

awk '$1 == "ALTER" { $5=$5+5 } 1'
对于etuardu的示例文件,这将生成

ALTER xx yy zz 15 10
NOALT aa bb cc 20 20
ALTER 11 22 33 35 30
下面是它的工作原理。有两种情况,表示为awk模式和操作。在第一种情况下,模式是对第一个字段的测试,以查看它是否等于
“ALTER”
,如果模式计算结果为true,则调用修改第五个字段的操作。第二个模式是final
1
;它始终为true,因此执行隐式
打印
操作


此解决方案的一个怪癖是:输入中读取的字段分隔符不必是输出中的字段分隔符。使用上述简单形式,输入中的字段分隔符被视为空白,而输出中写入单个空格;如果不需要,则将
FS
OFS
设置为特定值。但是,只有l更改字段的INE将使用新的字段分隔符,因此像“$1=$1”这样的空操作将强制重新生成所有记录(这是更改字段分隔符的方便方法,只需使用
$1=$1
).

可以。您还需要如何帮助吗?谢谢您的回答。我知道这个解决方案。只是我不想打印$1、$2……$32等。我正在寻找一个不太需要打印的解决方案。另外两个答案中的“怪癖”也是一个问题,所以我不会反对这个答案。回答很好(尽管我将“条件”称为“操作”。)@肖特:是的,这一怪癖在几乎任何解决方案中都存在,但我认为值得一提,因为它在这里并不明显。我将调整文本以使用模式和动作的标准awk术语;我希望您能再看一眼。@MichaelJ.Barber您的回答更好。谢谢@MichaelJ.Barber这非常有用。
[jaypal~/Temp]$ cat text8
NOALT aa bb cc 20 20
ALTER xx yy zz 10 10
ALTER xx yy zz 10 10
NOALT aa bb cc 20 20
ALTER 11 22 33 30 30

[jaypal~/Temp]$ awk '{if($1=="ALTER") {$5=$5+1;print"\n";for (i=1;i<=NF;i++) printf $i" ";} else print "\n"$0}' text8 | sed '/^$/d'
NOALT aa bb cc 20 20
ALTER xx yy zz 11 10 
ALTER xx yy zz 11 10 
NOALT aa bb cc 20 20
ALTER 11 22 33 31 30
awk '$1 == "ALTER" { $5=$5+5 } 1'
ALTER xx yy zz 15 10
NOALT aa bb cc 20 20
ALTER 11 22 33 35 30