按所需顺序对大文件进行排序

时间:2015-08-27 13:30:10

标签: python linux sorting bigdata

我的数据如下:

<j> <l> <n> "jd".
<K> <J> <N> <D>.
<A> <B> <D> <F>.
<E> <F> <G> "abc".    
<A> <B> <C> <D>.
<G> <k> "jd" "l".

我需要对数据进行排序,以便只对奇数行进行排序,并根据奇数行对相应的偶数行进行排序。即,仅使用奇数行进行文件的排序,即仅对以下行进行排序:

<j> <l> <n> "jd".
<A> <B> <D> <F>.
<A> <B> <C> <D>.

<A> <B> <C> <D>.
<A> <B> <D> <F>.
<j> <l> <n> "jd".

偶数行得到副本。例如,上面的排序顺序为:

<A> <B> <C> <D>.
<G> <k> "jd" "l".
<A> <B> <D> <F>.
<E> <F> <G> "abc".    
<j> <l> <n> "jd".
<K> <J> <N> <D>.

现在偶数行"<G> <k> "jd" "l"."总是出现在奇数行"<A> <B> <C> <D>."之后,偶数行"<E> <F> <G> "abc". "总是出现在奇数行"<A> <B> <D> <F>."和偶数行{{1}之后}}出现在奇数行"<K> <J> <N> <D>."

之后

我尝试使用带有并行选项的linux sort命令,因为我的文件大小是200 GB - 但这样做会使奇数行的顺序受到干扰。有没有办法使用linux sort命令或使用一些python程序我可能实现200 GB文件的所需行为

2 个答案:

答案 0 :(得分:1)

我同意使用Linux sort程序是一个好主意,因为它非常有效并且可以处理比RAM大得多的排序文件。诀窍是在&amp;之前转换您的数据。排序后,sort可以做你想做的事。

您需要在循环中读取数据,一次读取两行,将两行连接成一行,并将新行写入新文件。

接下来,对新文件进行排序,告诉sort仅对一行中的前4个键进行排序。

现在逐行读取排序数据,将每行拆分为两行,并将拆分数据写入最终目标文件。

可以使用awk或Python轻松编写行拆分和连接程序。我建议你自己写一下,但如果你在让他们正常工作时遇到问题,我会很乐意提供帮助(而且我也确定其他人也会这样做。)

答案 1 :(得分:1)

由于你使用的是linux,我认为你安装了vim(默认情况下我的ubuntu机器上有一个最小版本)。 如果没有,请先安装它。

我相信vim可以处理大文件而不会窒息(与记事本不同)

  1. 使用vim,将每一行与其下方的行合并
  2. input.dat

    <j> <l> <n> "jd". 
    <K> <J> <N> <D>.
    <A> <B> <D> <F>.
    <E> <F> <G> "abc".
    <A> <B> <C> <D>.
    <G> <k> "jd" "l".
    
      

    ex input.dat -c 'g/^/j' -c 'sav! joined.dat' -c q

    joined.dat:

    <j> <l> <n> "jd".  <K> <J> <N> <D>.
    <A> <B> <D> <F>a  <E> <F> <G> "abc".
    <A> <B> <C> <D>.  <G> <k> "jd" "l".
    

    g是全局命令,它匹配具有行开始(^)(每行)的每一行并执行join命令。 在那之后,你将每条偶数行附加到前一个不均匀的行,用两个空格分隔。

    然后它将(覆盖!)保存为joined.dat并退出

    1. 通常使用sort命令
    2. 对joined.dat文件进行排序

      Sorted.dat

      <A> <B> <C> <D>.  <G> <k> "jd" "l".
      <A> <B> <D> <F>a  <E> <F> <G> "abc".
      <j> <l> <n> "jd".  <K> <J> <N> <D>.
      
      1. “取消加入”您在第一步加入的内容
      2.   

        sed 's/. /.\n/' sorted.dat > finishedproduct.dat

        这假定您的初始文件在每行的末尾都有一个点。

        注意:如果你使用相同的文件作为sed的输入和输出,我相信你可以得到一个空白文件。

        finishedproduct.dat:

        <A> <B> <C> <D>.
        <G> <k> "jd" "l".
        <A> <B> <D> <F>.
        <E> <F> <G> "abc".
        <j> <l> <n> "jd".
        <K> <J> <N> <D>.
        

        在这种情况下,sed基本上为点和换行替换了一个点和两个空格,有效地替换了vim引入的两个空格来连接这些行。

        我知道这不是一个非常优雅的解决方案(更不用说pythonic)了,但它规避了“必须编写自定义程序”以及它涉及的内存问题。 ;)