我有一个带有16个字段的制表符分隔文件.我可以使用awk有条件地改变一个或多个字段并打印整行作为输出吗?例如,根据第一个字段中的值,我想说一个特定的数字添加到字段4,依此类推.但作为输出我必须打印整行.如果是的话,我想知道如何.
是的,这是一种方法:
awk '$1 == "ALTER" { $5=$5+5 } 1'
Run Code Online (Sandbox Code Playgroud)
使用etuardu的示例文件,可以生成
ALTER xx yy zz 15 10
NOALT aa bb cc 20 20
ALTER 11 22 33 35 30
Run Code Online (Sandbox Code Playgroud)
这是它的工作原理.有两种情况,表示为awk模式和操作.在第一个模式中,模式是第一个字段的测试,以查看它是否相等"ALTER",如果模式评估为true,则调用修改第五个字段的操作.第二种模式是最终的1; 它始终是真的,因此执行隐式print操作.
这个解决方案有一个怪癖:输入中读取的字段分隔符不必是输出中的字段分隔符.使用上面的简单形式,输入中的字段分隔符被视为空格,而单个空格被写入输出; 设置FS和OFS特定值,如果这不是你想要的.但是,只有字段更改的行才会有新的字段分隔符,因此像'$ 1 = $ 1'这样的空操作将强制重建所有记录(这是通过仅使用来更改字段分隔符的便捷方法$1=$1).