6番目の場所に、「ハッピー」という特定の単語を含む行数を見つける必要があるCSVファイルがあります。 5つのカンマの後ろ。
だから私はこれを書いています:
grep -P -c ",\{5,\}"'Happy' file.csv
しかし、0を返します。
ファイルの内容は次のとおりです。
123、abc、def、ghi、e444、ハッピー、224、e44
答え1
grep -E '^([^,]*,){5}Happy' <in >out
これで見つけることができます。Happy
5番目のカンマのすぐ隣にある場合にのみ適用されます。 6番目のフィールド内のどこでも見つけるために少しの呼吸スペースを追加します。
grep -E '^([^,]*,){5}[^,]*Happy' <in >out
一致する行のみを計算するには、次の-c
オプションを使用してください。
grep -cE '^([^,]*,){5}[^,]*Happy' <in >out
私は正規表現に慣れていますが、そうでなくても他の型よりもre構文を選択するようです。いくつかのベースラインを学ぶと、残りも所定の位置になります。正規表現は、非常に少数の基本コンポーネントを複数の方法で組み合わせて入力を記述します。
*
クリント- 前の式が0回以上発生することを示します。
[
角かっこ表現]
- 何が起こったかを示します。(
^
拒否されることがあります)文字セットを含める
- 何が起こったかを示します。(
{
最小,
最大}
繰り返し回数前の式の発生回数を指定します。
拡張正規表現メタ文字
?
はの略語です{0,1}
。
(
サブ式)
- 含まれるすべての式を単一の式として収集します。
.
特徴- 単一文字と一致
^|$
^
次の式の行開始アンカーポイント、|
式間の交互、または$
行末アンカーポイントを示します。
これが基本です。 POSIX-E
拡張正規表現構文には以下も含まれます。クライン +
- これは以下に関連しています。*
必要を除くすべての側面最後のもの前の表現と一致します。角かっこ式には、特に内部文字クラスと反復と一致する方法に関連する[
さまざまな微妙さがあります。実際にほとんどの実装]
[(:|.|=)
(=|.|:)]
延長する拡張された re 構文は、前のサブ式に対する少なくとも基本正規表現の逆\[num]
参照を処理できます。(
)
しかし、基本的に考えてみると、上記の表現の1つまたは他の単一の文字はそれ自体で表現され、すべて結合されて希望の一致を説明する完全な表現になります。
これらすべてをまとめると、grep
上記の式は次のように分類されます。
^([^,]*,){5}Happy
- 一番左の位置から始まり、一致する行には、ゼロ個以上の非カンマ文字で構成されるシーケンスが5個以下でなければなりません。各シーケンスの後にコンマ文字が続き、すべてのシーケンスの後に文字列が続きます。
Happy
。
- 一番左の位置から始まり、一致する行には、ゼロ個以上の非カンマ文字で構成されるシーケンスが5個以下でなければなりません。各シーケンスの後にコンマ文字が続き、すべてのシーケンスの後に文字列が続きます。
答え2
あなたはできます:
grep '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,Happy' file.txt
行の先頭から5つのカンマがあるとし、行のどこからでも開始する場合は、イニシャルを削除してください^
。
パターンは、単に連続して5つ以上のカンマを含む行を探します。
答え3
awk
CSVファイルで作業するときにコマンドを使用する方が簡単で簡単になります。フィールドの概念を自然にサポートするので、人生ははるかに簡単になります。
awk -F, '$6 == "Happy" { count++ } END { print count }' file.csv
コマンドは次のように分類されます。
awk - The command to run
-F, - Use a comma as the field separator
$6 == "Happy" - Only match lines where the sixth field equals "Happy"
{ count++ } - For each line matched, add one to the "count" variable
END - When all that is done...
{ print count } - ...print the value of "count"
file.csv - The file to read from