AWK:在打印“打印$ 0”时保留格式

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

paste file_1 file_2 > mixed_file 

每个文件都包含以下types的行

  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 

新创build的文件“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”来明确地定义格式并避免这个问题,但是我猜是存在更优雅的解决scheme。

AWK专家我很感谢你的帮助,

谢谢

亚历克斯

重新分配回$ 0就是你所追求的:

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

当你分配给一个字段awk重新格式化行。

它使用OFS的值(默认情况下是一个空格)。

你的输入有多个间隔的列。 awk不会重新创建。

你可以管到column -t来重新创建那种类型的输出。

你也可以将OFS设置为一个制表符( \t ),如果这可以得到你想要的输出。

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