Bashスクリプトで複数のファイルを比較する

Bashスクリプトで複数のファイルを比較する

bashとシェルプログラミングは私にとって新しいものです。拡張子を持つファイルがいくつかあります。.v.gz、bashコマンドでいくつかの操作を実行し、結果を同じファイル名に保存します。 。 txt拡張する。

例えば。 txtファイルデータは以下の通りです。ファイル名が異なり、拡張子が同じ4つのファイルを検討しています(おそらく30以上のファイルがある可能性があります)。

file_one.txt

statement_modeule_name_1 
statement_modeule_name_2
statement_modeule_name_3
statement_modeule_name_4
statement_modeule_name_5

data.txtのインポート

statement_modeule_name_6
statement_modeule_name_7
statement_modeule_name_2
statement_modeule_name_8
statement_modeule_name_9

ファイル.txt

statement_modeule_name_10
statement_modeule_name_11
statement_modeule_name_6
statement_modeule_name_4
statement_modeule_name_14

data_new.txt

statement_modeule_name_15
statement_modeule_name_16
statement_modeule_name_11
statement_modeule_name_5
statement_modeule_name_17

コマンドプロンプトで予想​​されるコード出力

file_one and Fetch_Data   statement_modeule_name_2

Fetch_Data and one_file   statement_modeule_name_6

file_one and Fetch_Data   statement_modeule_name_4

file_one and Fetch_Data and file4    statement_modeule_name_5

Fetch_Data and Data_new   statement_modeule_name_11

私がやっているコードは

for file in *.v.gz;
do
  zgrep -A1 "^module" "$file" | sed -n -e 's/^\(module \)*\(.*(.*)\).*$/\2/p' | cut -f1 -d"(" > $(basename "$file" .v.gz).txt
done     #the result what I get here I mentioned in the question .txt files with data (example)

誰でもこれを行うのに役立ちますか? pythonまたはbashスクリプトを使用できます(bashの場合はpython拡張を削除する必要があります)。

  • 最初のステップで、.txt形式で複数の出力ファイルを生成します。
  • これで、複数の.txtファイルを1行ずつ比較し、予想される出力と同じファイル名を持つファイルに同じ行がある場合は返したいと思います。

ベストアンサー1

$ FILES=( $(find -maxdepth 1 -type f -printf "%P\n") )

$ cat ${FILES[@]} | 
sort |
uniq -d |
xargs -r -d '\n' -I{} bash -c '
  echo $(sed "s/ / and /g" <<<$(grep -xl "{}" '"${FILES[*]}"')), {}'

結果:

file3.txt and file4.txt, modeule_name_11
file1.txt and file2.txt, modeule_name_2
file1.txt and file3.txt, modeule_name_4
file1.txt and file3.txt and file4.txt, modeule_name_5
file2.txt and file3.txt, modeule_name_6

説明する:

  • FILES=( $(find -maxdepth 1 -type f -printf "%P\n") )-$FILESファイルリストを保持する配列になります。
  • cat ${FILES[@]}- ファイルの内容を印刷します。
  • sort | uniq -d- 他のファイルに表示されない行を確認する必要がないため、重複した行(つまり、複数のファイルに表示される行)のみを表示します。
  • xargs -r -d '\n' -I{} bash -c '- 各行に対して次のスクリプトを実行します。区切り文字は新しい行なので、特殊文字をサポートできます。{}私たちが探している行に置き換えられます
  • grep -xl "{}" '"${FILES[*]}"'-l- 各行に対して、行全体(-x)に一致するファイル()を印刷します。
  • sed "s/ / and /g" <<<$(grep ... ))- 一致するファイル間のスペースを次に置き換えます。「そして」
  • echo $(...), {}- 一致する項目のリストを印刷し、その後に一致する行({})を表示します。

おすすめ記事