1

次のようなスペースで区切られた単語を含む.txtファイルがあるとします。

But where is Esope the holly Bastard
But where is

そしてAwk関数

cat /pathway/to/your/file.txt | tr ' ' '\n' | sort | uniq -c | awk '{print $2"@"$1}'

コンソールに次の出力が表示されます。

1 Bastard
1 Esope
1 holly
1 the
2 But
2 is
2 where

myFile.txtに印刷する方法は? 私は実際に30万行と200万語近くあります。結果をファイルに出力することをお勧めします。


編集:使用された回答(@Sudo_Oによる):

$ awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" myfile.txt | sort > myfileout.txt
4

3 に答える 3

5

パイプラインはあまり効率的ではなく、awk代わりにすべてを実行する必要があります。

awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file > myfile

ソートされた順序で出力が必要な場合:

awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file | sort > myfile

パイプラインによって提供される実際の出力は次のとおりです。

$ tr ' ' '\n' < file | sort | uniq -c | awk '{print $2"@"$1}'
Bastard@1
But@2
Esope@1
holly@1
is@2
the@1
where@2

注:catここで使用することは無意味です。入力を。でリダイレクトできます<awkスクリプトも意味がありません。単語と単語の頻度の順序を逆にして、それらを。で区切るだけです@。スクリプトをドロップするとawk、出力は目的の出力に近くなります(ただし、前の間隔に注意してください。ソートされていません)

$ tr ' ' '\n' < file | sort | uniq -c 
      1 Bastard
      2 But
      1 Esope
      1 holly
      2 is
      1 the
      2 where

sort次のコマンドで先頭のスペースを削除できsedます。

$ tr ' ' '\n' < file | sort | uniq -c | sort | sed 's/^\s*//'
1 Bastard
1 Esope
1 holly
1 the
2 But
2 is
2 where

しかし、冒頭で述べたように、awkそれを処理しましょう。

$ awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file | sort
1 Bastard
1 Esope
1 holly
1 the
2 But
2 is
2 where
于 2013-03-24T15:10:28.190 に答える
2

出力をファイルにリダイレクトするだけです。

cat /pathway/to/your/file.txt % tr ' ' '\n' | sort | uniq -c | \
awk '{print $2"@"$1}' > myFile.txt
于 2013-03-24T13:22:33.387 に答える
1

シェルリダイレクトを使用するだけです:

 echo "test" > overwrite-file.txt
 echo "test" >> append-to-file.txt

チップ

便利なコマンドはtee、ファイルにリダイレクトしても出力を表示できるようにすることです。

echo "test" | tee overwrite-file.txt
echo "test" | tee -a append-file.txt

並べ替えとロケール

アジアのスクリプトを使用しているようです。システムで使用されるロケールに注意する必要があります。結果として得られる並べ替えは、期待したものとは異なる場合があるためです。

*警告*環境によって指定されたロケールはソート順に影響します。LC_ALL = Cを設定して、ネイティブバイト値を使用する従来のソート順を取得します。

そして、の出力を見てください:

locale 
于 2013-03-24T13:24:40.083 に答える