![awk 合并两个大文件并删除重复的行](https://linux22.com/image/107264/awk%20%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E5%A4%A7%E6%96%87%E4%BB%B6%E5%B9%B6%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E7%9A%84%E8%A1%8C.png)
我有两个文件:
A.txt - 约 90GB
B.txt - 约 80GB
我想合并两个文件并删除重复的行。
我该怎么做呢?
如果除此之外的命令awk
更适合这项工作,请告诉我。
答案1
您可能不能使用awk
哈希,因为这意味着将所有唯一行存储在内存中。因此仅当输出文件明显小于系统上的可用内存时才可以使用。
如果输入文件已经排序,您可以执行以下操作:
sort -mu A.txt B.txt > C.txt
您可能需要将区域设置更改为与用于对文件进行排序的排序顺序相同的区域设置。
这不需要一次在内存中存储每个文件的多于一行。
如果它们没有排序,请删除-m
, 设置$TMPDIR
为具有 170GB 可用空间的文件系统(最好是快速的)中的目录,并准备稍等一下。
然而,结果将被排序,这将在需要时加快稍后合并另一个文件的速度。
sort
将使用临时文件,这样即使在内存很少的系统上也可以工作。但你的内存越多越好。对于 GNU sort
,另请参阅--compress-program
和--buffer-size
选项,它们可以帮助您调整以获得更好的性能。如果使用的排序顺序对您来说并不重要,请将区域设置修复为C
(with LC_ALL=C sort...
),因为这将是最有效的。
答案2
printf "">合并文件 猫 A.txt B.txt | 而 IFS= 读取 -r 行;做 如果 [ ! -z“$行”];然后 如果 ! grep -Fxqe "$line" MergFile;然后 echo "$line">>合并文件; 菲 菲 完毕
解释
使用 # 创建一个新的 MergeFile
printf "">MergeFile
或可选:touch MergeFile
将两个文件通过管道传输到 while 循环:
cat A.txt B.txt |
读取每一行:
while IFS= read -r line; do
处理空行:
if [ ! -z "$line" ]; then
*如果要保留第一个空行,请将其添加回 else 子句中
空结果意味着这是第一次进入 MergeFile (即,它是唯一的):
if ! grep -Fxqe "$line" MergFile; then
将其添加到合并文件中:
echo "$line">>MergeFile;
答案3
尝试这个命令:
cat A.txt B.txt | awk '!seen[$0]++' > C.txt
如此重的文件可能需要一段时间......