按所需顺序对大文件进行排序
Sorting a huge file in desired order
我有以下形式的数据:
<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 排序命令,因为我的文件大小是 200 GB - 但这样做会扰乱奇数行的顺序。有没有办法使用 linux 排序命令或使用一些 python 程序我可以实现 200 GB 文件的预期行为
我同意使用 Linux sort
程序是个好主意,因为它非常高效并且可以处理比 RAM 大得多的文件的排序。诀窍是在排序之前和之后转换数据,以便 sort
可以做你想做的事。
您需要在一次读取两行的循环中读取数据,将两行合并为一行并将新行写入新文件。
接下来,对新文件进行排序,告诉 sort
仅对一行中的前 4 个键进行排序。
现在逐行读取排序后的数据,将每行一分为二,并将拆分后的数据写入最终目标文件。
行拆分和连接程序可以很容易地用awk或Python编写。我建议尝试自己编写它们,但如果您在使它们正常工作时遇到问题,我会很乐意提供帮助(而且我相信 SO 上的其他人也会这样做。:)
由于您使用的是 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 是全局命令,它匹配具有行开头 (^) 的每一行(即每一行)并执行连接命令。
之后,您会将每条偶数线附加到其之前的由两个空格分隔的不均匀线。
然后保存(覆盖!)为 joined.dat 并退出
- 像通常使用排序命令一样对 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>.
- "Unjoin"你在第一步加入了什么
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 了)但它绕过了 "having to write a custom program" 及其涉及的内存问题。 ;)
我有以下形式的数据:
<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 排序命令,因为我的文件大小是 200 GB - 但这样做会扰乱奇数行的顺序。有没有办法使用 linux 排序命令或使用一些 python 程序我可以实现 200 GB 文件的预期行为
我同意使用 Linux sort
程序是个好主意,因为它非常高效并且可以处理比 RAM 大得多的文件的排序。诀窍是在排序之前和之后转换数据,以便 sort
可以做你想做的事。
您需要在一次读取两行的循环中读取数据,将两行合并为一行并将新行写入新文件。
接下来,对新文件进行排序,告诉 sort
仅对一行中的前 4 个键进行排序。
现在逐行读取排序后的数据,将每行一分为二,并将拆分后的数据写入最终目标文件。
行拆分和连接程序可以很容易地用awk或Python编写。我建议尝试自己编写它们,但如果您在使它们正常工作时遇到问题,我会很乐意提供帮助(而且我相信 SO 上的其他人也会这样做。:)
由于您使用的是 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 是全局命令,它匹配具有行开头 (^) 的每一行(即每一行)并执行连接命令。 之后,您会将每条偶数线附加到其之前的由两个空格分隔的不均匀线。
然后保存(覆盖!)为 joined.dat 并退出
- 像通常使用排序命令一样对 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>.
- "Unjoin"你在第一步加入了什么
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 了)但它绕过了 "having to write a custom program" 及其涉及的内存问题。 ;)