比较一个文件(保持行顺序)与"静态"文件

时间:2014-04-08 10:47:17

标签: linux awk

使用下面的awk调用之前我得到了很好的结果,我认为首先要检查" seafloor"的第一列中的值在#34; ctd"的第一列中,如果是这样,它给出了" ctd"的第二列的值,并且始终遵循" seafloor"的行顺序。 :

awk 'NR==FNR{A[$1]=$2;next} {i=int($1+.5)} i in A {print A[i]}' ctd seafloor

这意味着,如果" seafloor"第一列的值将高于" ctd"第一列,它给了一个空格,但是那行丢失了。

我认为这是因为我的"静态"文件名为" ctd" (海水温度随深度的变化,第1列中的水深和第2列中的温度)仅有3470米水深的信息,而我的变量"文件称为" seafloor" (或水深)水深达3470米。

"静态"文件有3470行,第1行从1到3470,第2行从1.78到23.69:

ctd: N = 3470   <1/3470>        <1.78/23.69>

事情就是现在&#34;海底&#34;水深达3862米(即深度超过ctd,第二列最高为3470):

seafloor: N = 13544     <1773.39/3862.14>

我意识到它没有像预期的那样工作,因为在使用这两个文件的awk调用后,我得到了9839条记录,而不是“海底”#34;中出现的13544条记录,即,我必须获得13544条记录,但在第一列&#34;海底&#34;的那些行中得到零(或例如NaN)超出&#34; ctd&#34;的第一列范围(例如,值为3471)。

我感谢任何解决这个问题的提示,如果需要进一步澄清,请告诉我。谢谢。

PS:ctd文件在这里:http://pastelink.me/dl/779584,海底文件在这里:http://pastelink.me/dl/f275bc

编辑1:

感谢Scrutinizer为新的awk调用,它运行良好。使用它之后,我将这个结果与我的旧文件(即两个文件中最多3470米)进行了比较,这个新输出与旧文件相同(即使用我原来的awk调用)。所以这个问题基本上是海底的最大深度&#34;它超出了3470米的范围&#34; ctd&#34;。

1 个答案:

答案 0 :(得分:1)

你的意思是这样的:

awk 'NR==FNR{A[$1]=$2; next} {i=int($1+.5); print A[i]+0}' crd seafloor

解释是,通过向数组元素添加零,它被强制转换为数字上下文,因此如果它已经包含数字,则没有任何更改,如果它是空的,则它变为0。 另外因为删除了if语句,所以每行输出输出。

副作用是它使用的内存比必要的多一点,但它稍微简单一些。如果内存使用成为一个问题,那么这将更有效:

awk 'NR==FNR{A[$1]=$2; next} {i=int($1+.5); print (i in A)?A[i]:0}' ctd seafloor