比较不同数字格式的文件

时间:2014-11-11 12:32:22

标签: sorting awk numbers format

首先,我要感谢您的社区,在过去的几个月里,由于您的详细答案和意见,您一直在帮助我。

然而,我遇到了一个障碍。我想比较包含模拟数据的2个文件。这些文件是先前操作的结果,其中包括从2个输出文件中提取所需数据。

所以output-file1-> sorteddata1    输出file2-> sorteddata2

Sorteddata1看起来像那样

0.200000e-4 a b c d e  
0.400000e-4 f g h i j  
0.560000e-4 k l m n o
            . 
            . 
            . 

Sorteddata2

2.000000E-5 A 
3.600000E-5 B 
5.600000E-5 C 
      . 
      . 
      . 

我希望如此,sorteddata3:

0.200000e-4 a b c d e A
0.400000e-4 f g h i j
0.560000e-4 k l m n o C
            .
            .
            .

因此,如果第一列中的数字相同,则在sorteddata1的第7列中的sorteddata2中添加相应的值。

我想从这里开始:

Compare files with awk

但每个文件第一列的数字格式不同,所以我没有得到任何回报。我真的很想用awk(个人喜好,我喜欢它)

目标是使用gnuplot绘制这个,所以希望最后一栏中的空白不会成为问题。

对此有何想法?

1 个答案:

答案 0 :(得分:0)

您可以使用sprintf使数字保持相同的格式:

  

sprintf (格式,表达式1,...)

     

返回(不打印)printf将打印的字符串   使用相同的参数(参见Printf)。

然后,逻辑与链接的答案中的逻辑相同,添加if/ default个案例以打印当前行或它与另一个文件中匹配的行一起。

awk 'NR==FNR {value=sprintf("%e", $1)
              a[value]=$2
              next
             }
     {value2=sprintf("%e", $1)
      print $0, a[value2]
     }' f2 f1

对于您的给定输入,它返回:

$ awk 'NR==FNR{value=sprintf("%e", $1); a[value]=$2; next} {value2=sprintf("%e", $1); if (value2 in a) {print $0, a[value2] }' f2 f1
0.200000e-4 a b c d e A
0.400000e-4 f g h i j
0.560000e-4 k l m n o C

在评论中注意,您说E格式显示"未终止字符串"你错了。因此,您可以使用E替换数字格式为e的{​​{1}}。一起来:

sub("E","e",$1)