2

最初に、ここに属さないかなりばかげた質問であることをお詫びします。

ここに私の問題があります: 多くのファイル名を含む 2 つの大きなテキスト ファイルがあり、それらを A と B と呼びましょう。A が B のサブセットであるかどうかを、順序を無視して、つまり、A の各ファイル名について、ファイル名も B にあり、それ以外の場合、A はサブセットではありません。

ファイルを前処理する方法 (ファイル名以外のものを削除し、大文字と小文字の違いを削除する方法) は知っていますが、シェル コマンドを使用してタスクを実行する簡単な方法があるかどうか疑問に思っています。

差分はおそらく機能しませんよね?最初に 2 つのファイルを「並べ替え」て、少なくとも両方に存在するファイルが同じ順序になるようにしても、A はおそらく B の適切なサブセットであるため、diff はすべての行が異なることを教えてくれます。

繰り返しますが、質問がここに属していない場合は申し訳ありません。最終的に、簡単な方法がない場合は、仕事をするための小さなプログラムを書くだけですが、より良いハンドルを取得しようとしているためです。シェルコマンドについては、まずここで質問しようと思いました。

4

3 に答える 3

0

XSD ファイルが WSDL ファイルのサブセットであるかどうかをテストします。

xmllint --format file.wsdl | awk '{$1=$1};1' | sort -u | wc
xmllint --format file.wsdl file.xsd | awk '{$1=$1};1' | sort -u | wc

これは、次を使用してRichieHindle の以前の回答のエレガントな概念を適応させます。

  1. xmllint --formatの代わりにcat、XML をきれいに印刷して、各 XML 要素が 1 行に収まるようにしsort -u | wcます。jq .jsonなど、他のきれいな印刷コマンドがここで機能する可能性があります。
  2. 空白を正規化するawk コマンド: 先頭と末尾を削除し (両方のファイルでインデントが異なるため)、内部を折りたたみます。警告: 要素内の XML 属性の順序は考慮されません。
于 2016-11-18T12:56:45.040 に答える
0

awkでそれを行う方法は次のとおりです

awk '
    # read A, the supposed subset file
    FNR == NR {a[$0]; next}
    # process file B
    $0 in a {delete a[$0]}
    END {if (length(a) == 0) {print "A is a proper subset of B"}}
' A B
于 2013-05-03T06:22:39.103 に答える