我有以下形式的数据:
"jd".
.
.
"abc".
.
"jd" "l".
我需要对数据进行排序,以便只对奇数行进行排序,并根据奇数行对相应的偶数行进行排序.即,仅使用奇数行进行文件的排序,即仅对以下行进行排序:
"jd".
.
.
至
.
.
"jd".
偶数行得到副本.例如,上面的排序顺序是:
.
"jd" "l".
.
"abc".
"jd".
.
现在偶数行“< G>< k>”jd“”l“.”总是出现在奇数行“< A>< B>< C>< D>”之后.并且偶数行“< E>< F>< G>>< 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可以处理大文件而不会窒息(不像记事本)
>使用vim,将每一行合并到它下面的一行
input.dat
"jd".
.
.
"abc".
.
"jd" "l".
ex input.dat -c 'g/^/j' -c 'sav! joined.dat' -c q
joined.dat:
"jd". .
a "abc".
. "jd" "l".
g是全局命令,它匹配具有行开始(^)(每行)的每一行并执行join命令.
在那之后,你将每条偶数行追加到前一个不均匀的行,用两个空格分隔.
然后它保存(覆盖!)作为joined.dat并退出
>像通常使用sort命令一样对joined.dat文件进行排序
Sorted.dat
. "jd" "l".
a "abc".
"jd". .
>“取消加入”你在第一步加入的内容
sed 's/. /.\n/' sorted.dat > finishedproduct.dat
假设您的初始文件在每行末尾都有一个点.
注意:如果你使用相同的文件作为sed的输入和输出,我相信你可以得到一个空白文件.
finishedproduct.dat:
.
"jd" "l".
.
"abc".
"jd".
.
在这种情况下,sed基本上替换点和换行符的点和两个空格,有效地替换vim引入的两个空格来连接行.
我知道它不是一个非常优雅的解决方案(更不用说pythonic)了,但它规避了“必须编写自定义程序”以及它涉及的内存问题. 😉来源:https://www.icode9.com/content-1-291451.html