2017-03-25 11 views
0

こんにちは私はこの問題の解決策を探しています。私はuniq -cを使ってソートした出力を持っています。コードは次のようになりますfind $DIR -type f | file -b $files | sort -n | uniq -c | sort -nr誰かが私に接頭辞の数字の値にどのようにアクセスできるか教えてください。 私の出力がどのように見えるか:一致する行の検索とカウント

21 ASCII text 
    19 C source, ASCII text 
    16 ASCII text 
    10 ASCII text, with very long lines 
    9 HTML document, UTF-8 Unicode text, with 
    2 HTML document, ASCII text, with very lon 
    1 C source, UTF-8 Unicode text 

Exprected出力:

ASCII text         : 21 
    C source, ASCII text      : 19 
    ASCII text         : 16 
    ASCII text, with very long lines   : 10 
    HTML document, UTF-8 Unicode text, with : 9 
    HTML document, ASCII text, with very lon : 2 
    C source, UTF-8 Unicode text    : 1 

がどのように変数にファイルタイプの前に値を保存することができますか?

+1

例データと予想される出力を記入してください。 –

+0

*ファイルタイプの前に値を変数に保存します* - あなたの変数はどこですか? – RomanPerekhrest

答えて

0

awkレスキュー!

... | awk '{k=$1;     # save counts   
      sub(/[^ ]+ /,"",$0); # remove the counts 
      $1=$1;     # normalize spaces 
      print $0 "\t:",k}' | # print in new order 
     column -ts$'\t'    # align tabs 

ASCII text        : 21 
C source, ASCII text      : 19 
ASCII text        : 16 
ASCII text, with very long lines   : 10 
HTML document, UTF-8 Unicode text, with : 9 
HTML document, ASCII text, with very lon : 2 
C source, UTF-8 Unicode text    : 1 

PSを出力します。 sort -nが外れていると思われます。fileはテキストを返しますが、この時点で数値的に並べ替える必要はありません。

+0

awkでbash関数を呼び出す方法はありますか? – Adam

+0

あなたは 'awk'の中でbashコマンドを呼び出すことができますが、これを達成したいと思っているかどうかは、良い考えかもしれません。 – karakfa

0

パイプラインをBashループと組み合わせると、パーツに対してコマンドを実行し、変数をパーツに割り当てることができます。

考える:

$ echo "$out" 
21 ASCII text 
19 C source, ASCII text 
16 ASCII text 
10 ASCII text, with very long lines 
9 HTML document, UTF-8 Unicode text, with 
2 HTML document, ASCII text, with very lon 
1 C source, UTF-8 Unicode text 

をあなたは区切り文字を割り当てるためにsedを使用します(この場合、私は:を使用します)、その後、パイプラインを読むことができます:

while IFS=: read -r fcnt ftype; do 
    printf "\t%-41s : %s\n" "$ftype" "$fcnt" 
done < <(echo "$out" | sed -e 's/^\([ [:digit:]]*\)\(.*\)/\1:\2/') 
    ASCII text        : 21 
    C source, ASCII text      : 19 
    ASCII text        : 16 
    ASCII text, with very long lines   : 10 
    HTML document, UTF-8 Unicode text, with : 9 
    HTML document, ASCII text, with very lon : 2 
    C source, UTF-8 Unicode text    : 1 

それからちょうどecho "$out"部品を交換あなたのパイプラインで。

効率性が問題になる場合は、sedと呼ぶのではなく、同じタイプのBash正規表現を使用することもできます。

関連する問題