Whileループはファイルの途中で壊れます。

Whileループはファイルの途中で壊れます。

テキストファイル(uniq.txt)を入力として使用し、grepを使用して他のファイル(stage.txt)内の重複エントリを見つけ、重複エントリの数と行の内容を別のFile Output.txtに書き込むwhileループがあります。 。

何らかの理由でwhileループはファイルの途中でランダムに停止しますか?

while read line; do
            results=$(grep ${line} ./stage.txt | wc -l)
            printf  '%s\n' "$line $results" >> Output.txt
            done < uniq.txt

ここに問題があります。私のwhileループは-bで停止します。

apps
archive.
AWACP
awac-pri
-b
backup
bad_file
bak.path
BasicPlu

答え1

-bこの時点では、ループはオプション${line}として解釈されるため、ループは停止します。これを防ぐには、より多くのオプションが見つからないように追加する必要があります。-bgrep--grep

results=$(grep -- "$line" ./stage.txt | wc -l)

答え2

問題は、次のコマンドラインフラグのように見える値を取得する変数で発生します。けいさとが指摘した。

しかし、あなたがやっていることも使用できます。

awk 'NR==FNR {p[++i]=$0;next} {for (i in p){if (match($0,p[i])){c[i]++}}} END {for (i in p){print p[i],c[i]}}' uniq.txt stage.txt >output.txt

...パターン数がuniq.txt数百万個でない場合。

公開スクリプトawk

NR==FNR { p[++i] = $0; next     }

        {
            for (i in p) {
                if (match($0, p[i])) {
                    c[i]++
                }
            }
        }

END     {
            for (i in p) {
                print p[i],c[i]
            }
        }

まず、各行をuniq.txt配列として読み、次に各パターンを含む2番目のファイルの入力行数をp(配列から)計算します。cp

最後に、パターンとその数が出力されます。

これは防ぎます遅いシェルループ(各パターンに対してgrep一度実行し、wc出力ファイルを複数回開いて書き込み)を使用する必要はありませんread

固定文字列の一致を実行するには、つまりuniq.txt正規表現パターンではなく固定文字列(と同じgrep -F)で行を処理するには、match($0, p[i])関数呼び出しをに変更するだけですindex($0, p[i])

関連情報