分享

python – 按所需顺序对一个巨大的文件进行排序

 印度阿三17 2019-07-02

我有以下形式的数据:

<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>>< G>”abc“.”总是出现在奇数行“< A>< B>< D>< F>.”之后.并且偶数行“< K>< J>< N>< D>.”出现在奇数行< j>之后&LT L个; &LT N&GT “JD”.

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

解决方法:

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

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

>使用vim,将每一行合并到它下面的一行

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并退出

>像通常使用sort命令一样对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>.

>“取消加入”你在第一步加入的内容

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)了,但它规避了“必须编写自定义程序”以及它涉及的内存问题. 😉

来源:https://www./content-1-291451.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多