2つのディレクトリで名前は同じですが、行数が異なるファイルを見つける方法は?

2つのディレクトリで名前は同じですが、行数が異なるファイルを見つける方法は?

sub1次のファイルを含むディレクトリがあります。

$ wc -l *

5 file1.csv
5 file3.csv
1 file4.csv

にはsub2次のものがあります。

$ wc -l *
5 file1.csv
5 file2.csv
1 file3.csv
5 file4.csv
1 file5.csv

最初のディレクトリには行が追加されたファイルがある可能性があり、そのファイルは2番目のディレクトリに移動します。この例ではfile3sub2

違いのあるファイルのリストを取得するには?


diff私はandでいくつかのテストをしましたが、grepディレクトリに別のファイルがあるので動作しません(したがって行が異なります)。

~/dir1/$ wc -l >> wc.luis

~/dir1/$ wc -l * | awk '{ gsub(/\/home.*dir1\//,""); print $0 }' 
                 | diff --side-by-side wc.luis -
                 | grep \|

理想的には、次のリストを取得します。

5 file3.csv | 1 file3.csv
1 file4.csv | 5 file4.csv

助けてくれてありがとう!


メモ:

  • 変更に関係なく、すべてのファイルが更新されたため、日付を確認できません。

  • 時には最新のファイル部族いくつかの線があるので、大きな線では到達できません。

ベストアンサー1

以下は、出力例を含む高速で汚れたシェル「1行」です。

$ join -j2 <(cd sub1; wc -l *) <(cd sub2; wc -l *) | awk '$2!=$3'
file3.csv 5 1
file4.csv 1 5
total 11 17

このtotal行はの出力結果ですwc。他のフィルタを使用して削除できます。

$ join -j2 <(cd sub1; wc -l *) <(cd sub2; wc -l *) | awk '$2!=$3' | head -n-1
file3.csv 5 1
file4.csv 1 5

説明する:

join共通列に基づいて2つのファイルが結合されます。この例では、-j22番目の列()に基づいて結合します。wc出力の2番目の列はファイル名です。これにより、両方のディレクトリに共通のファイルのみが印刷されます。

電話時間wcは次のとおりです。プロセスの交換作業ディレクトリがsub1左右に変わるため、ディレクトリsub2名なしでファイル名が印刷されます。この方法でjoin共通ファイルを見つけることができます。

このawkコマンドは、2番目の列と3番目の列の値を比較し、値が異なる場合にのみ行を印刷します。これにより、同じ行数のファイルがフィルタリングされます。

head -n-1すべての行を印刷しますが、最後の行は印刷しません。totalこれにより、最後の行がフィルタリングされますwc

おすすめ記事