我有很大的 3 列文件(约 10,000 行),当该行第三列的内容出现在另一行的第三列中时,我想删除行。文件的大小使排序有点麻烦,我不能使用类似下面的代码,因为整行不相同;只是第 3 列的内容。
awk '!seen[$0]++' filename
Run Code Online (Sandbox Code Playgroud) 我想问一下 '| 是否有开箱即用的多核等价物。排序 | uniq -c | sort -n' 命令?
我知道我可以使用以下程序
split -l5000000 data.tsv '_tmp';
ls -1 _tmp* | while read FILE; do sort $FILE -o $FILE & done;
sort -m _tmp* -o data.tsv.sorted
Run Code Online (Sandbox Code Playgroud)
但它的味道有点压倒性。
我正在对大文件(>100Go)进行排序,并且为了减少在磁盘写入上花费的时间,我正在尝试使用 GNU sort 的--compress-program参数。(相关:如何对大文件进行排序?)
但是,在某些情况下似乎只有第一个临时文件被压缩。我想知道为什么,以及我可以做些什么来压缩所有临时文件。
我在用:
sort (GNU coreutils) 8.25lzop 1.03 / LZO library 2.09重现问题的步骤:
你需要一些东西,比如 ~15Go 空闲空间,~10Go ram,一段时间
首先,使用以下 C 代码创建一个 10Go 文件:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
unsigned long n;
unsigned char i;
srand(42);
for(n = 0; n < 1000000000; n++) {
for(i = 0; i < 3; i++) {
printf("%03d", rand() % 1000);
}
printf("\n");
}
fflush(stdout);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并运行它:
$ gcc -Wall -O3 -o generate generate.c
$ …Run Code Online (Sandbox Code Playgroud)