奇怪的记忆行为处理TSV

时间:2016-10-06 06:07:18

标签: c bash sorting unix memory

我有一个.tsv,我需要弄清楚特定列中的频率变量,并按降序组织这些数据。我在c中运行一个脚本,它下载一个缓冲区并将其保存到.tsv文件中,该文件的日期标记与我的代码位于同一目录中。然后我打开终端并按this awesome SO answer运行以下命令:

cat 2016-09-06T10:15:35Z.tsv | awk -F '\t' '{print $1}' * | LC_ALL=C sort | LC_ALL=C uniq -c | LC_ALL=C sort -nr > tst.tsv

为了通过管道将其分开,这样做的是:

  1. cat .tsv文件将其内容放入管道

  2. awk -F '\t' '{print $1}' *按标签打开文件的内容,并将第一列的内容推送到管道中

  3. LC_ALL=C sort获取管道的内容并对它们进行排序,使其具有彼此相邻的like值,然后将其推回管道

  4. LC_ALL=C uniq -c获取管道中的内容并计算每个值发生的次数,然后将其推回管道(例如,Max 3,如果名称Max显示3次)< / p>

  5. 最后,LC_ALL=C sort -nr再次将管道中的内容按降序排序,然后将其打印到stdout,我将其输入文件。

  6. 这是事情变得有趣的地方。如果我在与下载我的.tsv文件的c代码相同的目录中完成所有这些操作,我会得到超级古怪的结果,这些结果似乎是我实际的.tsv文件的混合,一些是随机的腐败的垃圾,以及首先得到它的c代码的内容。这是一个例子:

    (计数)(值)

     1     fprintf(f, " %s; out meta qt; rel %s; out meta qt; way %s; out meta qt; >; out meta qt;", box_line, box_line, box_line);
       1     fclose(f);
       1     char* out_file = request_osm("cmd_tmp.txt", true);
       1     bag_delete(lines_of_request);
       1 
       1 
       1 
       1 
    
       1 
    
       1??g?
       1??g?
       1?
       1?LXg$E
    

    ...等等。现在,如果你向上滚动,你也可以找到一些正确的值,来自我正在解析的.tsv

    (计数)(值)

       1 312639
       1 3065411
       1 3065376
       1 300459
       1 2946076
    

    ...等等如果我将.tsv移动到自己的文件夹中,然后cd进入该文件夹并再次运行相同的命令,它就能完美运行。

    (计数)(值)

    419362 452999
    115770 136420
    114149 1380953
    72850 93290
    51180 587015
    45833 209668
    31973 64756
    31216 97928
    30586 1812906
    

    显然我对我的问题有一个功能性的答案 - 只是在解析之前将文件放在自己的文件夹中。但我认为这种内存损坏表明可能存在一些更大的问题我应该现在解决这个问题,而且我宁愿在它上面找到一个临时的症状性补丁,可以这么说。

    我应该提一下,我的c代码有时会使用system(cmd)

1 个答案:

答案 0 :(得分:2)

第二个命令是问题:

awk -F '\t' '{print $1}' *

最后看到星号?它告诉awk处理当前目录中的所有文件。相反,您只想处理标准输入(管道输出)。

只需删除星号,就可以了。