AWK:打印时保留格式"打印$ 0"

时间:2014-11-03 17:54:07

标签: linux awk formatting text-files

我正在尝试使用AWK来操作两个文件。好吧,我实际上是在两者之间进行插值。由于我不太熟悉如何使用AWK同时处理两个文件,我首先进行粘贴

paste file_1 file_2 > mixed_file

这些文件中的每一个都包含以下类型的行

   2.02646E+12  ERR   7.39921E+09 EG =   67
   1.82357E+12  ERR   7.01570E+09 EG =   68
   8.65566E+11  ERR   4.35764E+09 EG =   69

新创建的文件' mixed_file'看起来像这样

 2.02646E+12  ERR   7.39921E+09 EG =   67        2.02646E+12  ERR   7.39921E+09 EG =   67
 1.82357E+12  ERR   7.01570E+09 EG =   68        1.82357E+12  ERR   7.01570E+09 EG =   68
 8.65566E+11  ERR   4.35764E+09 EG =   69        8.65566E+11  ERR   4.35764E+09 EG =   69

这是我的问题:当我尝试做类似

的事情时
awk  ' / EG = / {$1=0.5*($1+$7)}  {print $0} ' mixed_file

我的格式完全错误

2026460000000 ERR 7.39921E+09 EG = 67 2.02646E+12 ERR 7.39921E+09 EG = 67
1823570000000 ERR 7.01570E+09 EG = 68 1.82357E+12 ERR 7.01570E+09 EG = 68
865566000000 ERR 4.35764E+09 EG = 69 8.65566E+11 ERR 4.35764E+09 EG = 69

我认为1美元的变化很可能是因为浮动字符与字符混合。原则上可以通过使用" printf"来明确定义格式并避免此问题,但我想存在更优雅的解决方案。

AWK专家,非常感谢您的帮助,

谢谢

亚历

2 个答案:

答案 0 :(得分:4)

重新分配回$ 0是你之后的事情:

awk  '/ EG = / {$0 = sprintf(" %7.5E%s", 0.5*($1+$7), substr($0,13))} 1' mixed_file

答案 1 :(得分:3)

当您指定一个字段时,awk会重新格式化该行。

它使用OFS的值(默认为空格)。

您的输入具有多个间隔的列。 awk没有重新创建它。

如果需要,您可以通过管道传输到column -t来重新创建那种输出。

如果能够获得所需的输出,您还可以将OFS设置为标签(\t)。

我不知道如何让awk本身保留输入格式(尽管我认为gawk较新版本中的RT变量可能允许手动完成)。