我的数据如下:
<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文件的所需行为
答案 0 :(得分:1)
我同意使用Linux sort
程序是一个好主意,因为它非常有效并且可以处理比RAM大得多的排序文件。诀窍是在&amp;之前转换您的数据。排序后,sort
可以做你想做的事。
您需要在循环中读取数据,一次读取两行,将两行连接成一行,并将新行写入新文件。
接下来,对新文件进行排序,告诉sort
仅对一行中的前4个键进行排序。
现在逐行读取排序数据,将每行拆分为两行,并将拆分数据写入最终目标文件。
可以使用awk或Python轻松编写行拆分和连接程序。我建议你自己写一下,但如果你在让他们正常工作时遇到问题,我会很乐意提供帮助(而且我也确定其他人也会这样做。)
答案 1 :(得分:1)
由于你使用的是linux,我认为你安装了vim(默认情况下我的ubuntu机器上有一个最小版本)。 如果没有,请先安装它。
我相信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并退出
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)了,但它规避了“必须编写自定义程序”以及它涉及的内存问题。 ;)