0

各行に 5 つの要素を持つファイルがあるとします。

$ cat myfile.txt

e1 e2 e3 e4 e5
e1 e1 e2 e2 e1
e1 e1 e4 e4 e4

行ごとに、次のコマンドを実行して、各行の一意の要素をカウントしたい.:

tr \\t \\n | sort -u | wc 

コマンドの最初の部分がわかりません - 誰か助けてくれませんか?

免責事項: ファイルは実際には以下に示すように見えますが、最初の部分に示すように xargs -L 5 を実行して出力を取得します。

e1
e2
e3
e4
e5 
4

3 に答える 3

2

入力ファイルが与えられた場合:

$ cat file
e1 e2 e3 e4 e5
e1 e1 e2 e2 e1
e1 e1 e4 e4 e4

を使用したファイル内の一意の要素awk:

awk '{for(i=1;i<=NF;i++) a[$i]} END{for (keys in a) print keys}' 
e1
e2
e3
e4
e5

grepの代わりに使用するファイル内の一意の要素tr:

$ grep -Eo '\w+' file | sort -u
e1
e2
e3
e4
e5

ファイル内の行ごとの一意の要素:

使用awk:

$ awk '{for(i=1;i<=NF;i++) a[$i]; print length(a); delete a}' file
5
2
2

awkソリューションは本当にここに行く方法ですが、bashタグ付けしてから使用します:

#!/bin/bash

while read line; do
  echo $line | grep -Eo '\w+' | sort -u | wc -l 
done < file

出力:

5
2
2
于 2012-12-05T11:10:07.797 に答える
1

あなたが好きなら、これはperlバージョンです:

perl -F'\s' -pane '%H=map{$_=>1}@F; $_=keys(%H)."\n"' myfile.txt
于 2012-12-05T11:51:44.033 に答える
1

これを使用できます:

perl -F -lane '$count{$_}++ for (@F);print scalar values %count;undef %count' your_file

以下でテスト:

> cat temp
e1 e2 e3 e4 e5
e1 e1 e2 e2 e1
e1 e1 e4 e4 e4
> perl -F -lane '$count{$_}++ for (@F);print scalar values %count;undef %count' temp
5
2
2
>
于 2012-12-05T11:13:50.613 に答える