2

我有 100 个 .txt 文件,每个文件约有 100 万行。

有没有办法打开所有文件,删除重复项并将行相应地保存到每个文件(php/unix 等)?


例如:

file1.txt 内容

Something here1
Something here2

file2.txt 内容

Something here2
Something here3

拆除后:

file1.txt 内容

Something here1
Something here2

file2.txt 内容

Something here 3
4

3 回答 3

1

使用 Unix 排序和 grep:

如果行的顺序无关紧要:

 sort -u file1.txt > _temp && mv _temp file1.txt

如果行的顺序很重要:

 awk 'FNR==NR{a[$0];next} ($0 in a) {delete a[$0]; print}' file1.txt file1.txt _temp && mv _temp file1.txt
 grep -v -f file1.txt file2.txt > _temp && mv _temp file2.txt
于 2013-08-02T12:59:33.083 回答
0
  • 获取文件的每一行作为数组
$file1 = explode("\n", file_get_contents('file1.txt')); 
$file2 = explode("\n", file_get_contents('file2.txt')); 
  • 使用 array_unique 删除文件中的重复项
$f1 = array_unique($file1); 
$f2 = array_unique($file2); 
  • 从第二个数组中删除重复项与第一个比较
$new_f2 = array_diff($f2,$f1);

现在您有了 $f1 和 $new_f2 唯一值。

现在只需更新文件。

注意:对于多个文件,递归执行此操作

于 2013-08-02T13:08:54.850 回答
0

我测试了这个,它有效。每个文件中都没有维护行的顺序,但是您在评论中说您已经在应用sort,所以这没关系。这是一个小迂回,但它确实有效:

   #!/bin/bash

   #The number of files you have, named like file1.txt, file2.txt, etc.
   # If named otherwise, cahnge the definition of variable "file" in the loop below.
   NUM_FILES=3

   #These files will be created and removed during the script, so make sure they're
   # not files you already have around.
   tempfile1="_all.txt"
   tempfile2="_tmp.txt"

   sort -u file1.txt > file1out.txt
   cat file1out.txt > $tempfile1

   for i in $(seq 2 $NUM_FILES)
   do
       prev=$((i-1))
       pofile="file${prev}out.txt"
       file="file$i.txt"
       ofile="file${i}out.txt"

       echo "Input files: $file $pofile"
       echo "Output file: $ofile"
       cat $tempfile1 $pofile > $tempfile2
       sort -u $tempfile2 > $tempfile1
       sort -u $file | comm -23 - $tempfile1 > $ofile
   done

   rm -f $tempfile1 $tempfile2
于 2013-08-02T12:47:21.907 回答