さらに分析するには、テキストファイル内のパターンを識別する必要があります。したがって、入力ファイルには、次のように半構造化されたテキストを含めることができます。
ファイル1
905:john: abc123: [email protected]: US
920:eric: ericaA: [email protected]: US
1000: rio: ri0ri0: [email protected]: IN
ファイル2
nathen <tab> [email protected] <tab> 764323545 <tab> UK
thomas <tab> [email protected] <tab> 563363421 <tab> UK
ian <tab> [email protected] <tab> 3453245472 <tab> SP
1行あたりの単語数は、文書によって異なる場合があります。区切り文字もさまざまですが、文書ごとに一意です。私が望むのは、各文書の1行あたりの単語数を数えることです。
出力は次のとおりです。
ファイル1の場合
5
5
5
5
ファイル2の場合
4
4
4
4
私はこれを区切り文字を持つすべてのファイルに一般化したいと思います。それができます- | : \space+ \tab+
。
一部の文書は次のとおりです。
| [email protected] | er34532 |
| [email protected] | 764474 |
ベストアンサー1
file2の単純な形式とスペースで区切られた単語の場合は、次のことを試してください。
$ awk '{print NF}' file2
4
4
4
awk ではNF
フィールド数です。デフォルトでは、awk では単語文字はスペースで区切られます。
:
file1の場合、単語はコロンまたはスペースで区切ることができるため、フィールド区切り文字に以下を追加する必要があります。
$ awk -F'[: \t]+' '{print NF}' file1
5
5
5
改善する
行に先行または末尾のスペースがある場合、awk は追加フィールドがあると想定します。 file1と同様に、フィールドを計算する前にこれらのスペースを削除することでこの問題を解決できます。
awk -F'[: \t]+' '{gsub(/^[: \t]+|[: \t]+$/, ""); print NF}' file1
またはfile2は次のようになります。
awk '{gsub(/^[[:space:]]+|[[:space:]]+$/, ""); print NF}' file2
正規表現では、前の^[[:space:]]+
スペースと[[:space:]]+$
末尾のスペースと一致します。コマンドでその組み合わせを使用すると、gsub
両方が削除されます。
一般化する
フィールド区切り文字が - |: またはいずれかである場合は、以下を使用します。
awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}'
例:
$ cat file3
| [email protected] | er34532 |
| [email protected] | 764474 |
$ awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}' file3
2
2