1

多数のファイルの2列目の要素の出現回数を数える必要があります。私が使用しているスクリプトは次のとおりです。

{
 el[$2]++
}
END {
    for (i in el) {
    print i, el[i] >> "rank.txt"
    }
 }

多数のファイルで実行するために、私はfind | xargsこの方法を使用しています:

find . -name "*.txt" | xargs awk -f script.awk

問題は、出力ファイルの行数をrank.txt(を使用してwc -l rank.txt)カウントすると、取得する数(たとえば、7600)が2番目の行の一意の要素の数(たとえば、7300)よりも大きいことです。 a:

find . -name "*.txt" | xargs awk '{print $2}' | sort | uniq | wc -l

実際に:を与える

awk '{print $1}' rank.txt | sort | uniq | wc -l

適切な数の要素を取得します(例に従って、7300を取得します)。つまり、出力ファイルの最初の列の要素が一意ではないことを意味します。しかし、これは起こらないはずです!

4

2 に答える 2

5

これはおそらく、入力ファイル(*.txt)に一意でない要素が含まれているという事実とxargs機能の組み合わせです。多数のファイルがある場合、 xargsは異なる引数のセットで繰り返し呼び出されることに注意してください。これは、最初の例では、ファイルの数が多い場合、一部のファイルが1回のawk実行で処理されないため、出力内の「一意の」要素の数が多くなることを意味します。

あなたはこれを試すことができます:

find . -name "*.txt" | xargs cat | awk -f script.awk
于 2011-10-14T23:35:24.463 に答える
0

$1 の重複していない部分を調べるには、次のようにします。

find . -name "*.txt" | xargs awk '{print $2}' | sort | uniq -c | awk '$1 > 1 {print}'

現在、これをテストする方法はありません。最後の awk の目的は、の出力をフィルタリングuniq -cして、カウントが 1 より大きいレコードのみを表示することです。

これが役立つことを願っています。

于 2011-10-14T23:22:58.233 に答える