ファイル内の重複行を見つけてファイル名を使用して出力し、ディレクトリ全体に対してこれを行うにはどうすればよいですか?

ファイル内の重複行を見つけてファイル名を使用して出力し、ディレクトリ全体に対してこれを行うにはどうすればよいですか?

1つのディレクトリに複数のファイルがあり、各ファイルで重複した行を見つけてファイル名を表示して、重複したファイルを識別する必要があります。

私は試した:for i in *.*;do sort $i | uniq -d ; done

重複した行が表示されますが、ファイル名を表示して重複したファイルを識別するにはどうすればよいですか?

上記のコマンドはcsv、.txtファイルでのみ機能します。 .xlsxファイルを確認する他の方法はありますか?

答え1

  1. sed- にすでに存在するプレフィックスを使用して、各行にプレフィックスを追加できます$i

これにより、トリックを実行できます。

for i in *.*; do sort $i|uniq -d |sed -e "s/^/$i:/"; done

読みやすくするために拡張されました:

for i in *.*; do
  sort $i | uniq -d | sed -e "s/^/$i:/";
done
  1. xlsxファイルは実際にはファイルのzipディレクトリなので、xlsxを解凍して.xlsxの下の内容を見ることができますfile/xl/worksheets/sheet1.xml。ただし、これらのファイルはxml形式なので、処理する前に解析する必要があります。

答え2

重複した行を含むファイルを検索するオプション。
空白の行もパターンと一致することがあります。

awk 'D[$0]++ {print FILENAME; nextfile}' *.*

空の行を除外するには、次のような他のフィルタを追加する必要があります。

awk '/./ && D[$0]++ {print FILENAME; nextfile}' *.*

したがって、空白文字を含む行を除外できます。

gawk '/\S/ && D[$0]++ {print FILENAME; nextfile}' *.*

以下はあなたの仕事に対する答えです(空白や空白行なし)。

awk 'FNR == 1 {delete D;j=0} /[^[:blank:]]/ && (D[$0]++ == 1) {if(! j++ ) print "name: " FILENAME; print}' *.*

関連情報