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

标签 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>."之后和偶数行 "<K> <J> <N> <D>."出现在奇数行<j> <l> <n> "jd".之后

我尝试使用带有并行选项的 linux sort 命令,因为我的文件大小是 200 GB——但这样做会打乱奇数行的顺序。有没有办法使用 linux sort 命令或使用一些 python 程序我可以实现 200 GB 文件的预期行为

最佳答案

由于您使用的是 linux,我假设您已经安装了 vim(我的 ubuntu 机器上默认安装了一个最小版本。 如果没有,请先安装它。

我相信 vim 可以毫不费力地处理大文件(不像记事本)

  1. 使用 vim,将每一行与其下面的行合并

输入.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

加入.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 是全局命令,它匹配以行开头 (^)(即每一行)的每一行并执行连接命令。 之后,您会将每条偶数线附加到其之前的不均匀线,并用两个空格分隔。

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

  1. 像通常使用 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>.
  1. “取消加入”您在第一步加入的内容

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

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

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

成品.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 了),但它避免了“必须编写自定义程序”及其涉及的内存问题。 ;)

关于python - 按所需顺序对大文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250759/

相关文章:

linux - 主动等待在linux中常见吗

python - 为什么输出不显示 k1、k2、k3?

python - cv2.imshow 和 cv2.imwrite

linux - 是否有包含 linux 网络负载的文件?

linux - 半开套接字上的 select() 不会在 close() 上返回?

ruby-on-rails - Rails 3 default_scope 按外键对象名称排序?

javascript - 使用 AngularJS 对标题单击的表格进行排序,该表格同时包含数字和字符串作为列值

c++ - 对这 n^2 个数字进行排序的最快方法是什么?

python - 在 OpenCV 中绘制有角度的矩形

python - 忽略对角线的 Numpy 数组的最小值