2

2 つの単一列リストを含む 2 つのファイルがあります。

//file1 - 一意の値の完全なリスト
AAA
BBB
CCC

//file2
AAA
AAA
BBB
BBB

//結果は次のようになります:
CCC

file2 に一致しない値のリストを file1 から生成する必要があります。bash スクリプト (できれば awk などの特別なツールを使用しない) または DOS バッチ ファイルを使用する必要があります。

ありがとうございました。

4

3 に答える 3

4

方法 1

grepの -v フラグの仕事のようです。

grep -v -F -f  listtocheck uniques

方法 2

ドレイク クラリスのソリューションのバリエーション (いくつかのファイルを使用してチェックするように拡張できますgrepが、最初にマージしないと実行できません) は、次のようになります。

(
    sort < file_to_check | uniq
    cat reference_file reference_file
) | sort | uniq -u

これを行うことによりfile_to_check、括弧内のサブシェルによって結合された出力に、単語が 1 回だけ表示されます。の単語は少なくとも 2 回reference_file出力され、両方のファイルに含まれる単語は少なくとも 3 回出力されます。最初のファイルから 1 回、2 番目のファイルの 2 つのコピーから 2 回です。

必要な単語、つまり一度出現する単語を分離する方法を見つける必要があるだけですsort | uniq -u

最適化Ⅰ

多くreference_fileの重複が含まれている場合は、より重いものを実行する価値があるかもしれません

sort < reference_file | uniq
sort < reference_file | uniq

の代わりにcat reference_file reference_file、より小さな出力を持ち、最終的な重みを減らすためにsort

最適化Ⅱ

既にソートされたファイルを効率的にマージできるため、一時ファイルを使用した場合、これはさらに高速になります (また、異なるファイルでチェックを繰り返す場合、再ソートする必要なく、同じソート済み参照ファイルを何度も再利用できます)。 ); したがって

sort < file_to_check  | uniq > .tmp.1
sort < reference_file | uniq > .tmp.2
# "--merge" works way faster, provided we're sure the input files are sorted
sort --merge .tmp.1 .tmp.2 .tmp.2 | uniq -u
rm -f .tmp.1 .tmp.2

最適化Ⅲ

最後に、1 つのファイルで同一の行が非常に長く実行される場合 (たとえば、一部のログ システムの場合など)、2 回実行することも価値がある場合がありuniqます。は線形時間で動作するため、は線形時間です。uniqsort

uniq < file | sort | uniq > .tmp.1
于 2012-08-14T15:32:18.277 に答える
2

Windows CMDソリューション(一般にDOSと呼ばれますが、実際にはそうではありません)の場合:

それは同じくらい単純でなければなりません

findstr /vlxg:"file2" "file1"

ただし、複数のリテラル検索文字列がある場合に一致が欠落する可能性があるfindstrバグがあります。

大文字と小文字を区別しない検索が許容される場合は、/Iオプションを追加することでバグを回避できます。

findstr /vlixg:"file2" "file1"

ネイティブのWindowsコマンドに制限されていない場合は、grepforWindowsなどのユーティリティをダウンロードできます。Windows用のGnuユーティリティは良い情報源です。次に、Windowsと'nixの両方でIsemiのソリューションを使用できます。

Windows用のVBScriptまたはJScriptソリューションを作成するのも簡単です。

于 2012-08-14T16:02:22.327 に答える
1
cat file1 file2 | sort | uniq -u
于 2012-08-14T16:03:25.253 に答える