フォルダが多く、フォルダにファイルが含まれています。単一ファイルまたは複数のファイルに同じ行が複数回表示されることがあります。ファイルがソートされません。したがって、一部の行は複数のファイルで繰り返され、これらのファイルは別のフォルダにあります。
重複した行を削除し、すべてのファイルでそれらの1つだけを維持したいと思います。ファイル構造と名前も同じにしてください。
私は試しましたが、すべてのファイルではなく、各ファイルでのみ一意にしました。このコードは各ファイルの行を一意にし、ファイル名を保持します。
for i in $(find . -type f); do
awk '!seen[$0]++' "$i" > tmp_file
mv ./tmp_file "$i"
done
Q:ファイル構造と名前を維持しながら、すべてのサブフォルダ内のすべてのファイルで行を一意にするにはどうすればよいですか?
以下は私のファイルの例です。簡単にするために、ここにはファイルのみをリストし、ファイルは同じフォルダまたは別のフォルダにあります。
入力する:
$ cat File-1
1
2
3
1
$ cat File-2
2
3
4
1
$ cat File-3
2
4
5
6
出力:
$ cat File-1
1
2
3
$ cat File-2
4
$ cat File-3
5
6
私の場合、その行の最初の出現を維持することをお勧めしますが、必須ではありません(保持された行はすべてのファイルに存在する可能性があります)。
ベストアンサー1
#!/usr/bin/perl
use File::Find;
my $headdir="/some/path";
my @files=();
my $lines={};
find( { wanted => sub { push @files, $_ }, no_chdir => 1 }, $headdir );
foreach my $file (@files) {
next unless(-f $file);
system "cp $file $file". ".old";
open(my $fhin, "$file".".old");
open(my $fhout, ">$file");
while(<$fhin>) {
if(not defined $lines->{$_}) {
print $fhout $_;
$lines->{$_} = 1;
}
}
close($fhin);
close($fhout);
#optional: system("rm $file".".old");
}
編集する:質問に記載されているファイルでのみテストするには、コードを少し変更する必要があります。