値にキャリッジリターンが含まれているため、実際の行数を取得できません。

値にキャリッジリターンが含まれているため、実際の行数を取得できません。

ここに画像の説明を入力してください。

入力区切りファイルがあります。ファイルの実際のレコード数は4です。ただし、値のキャリッジリターン文字のため、合計数は8です。最初の列の値に基づいて行数を計算したいと思います。

答えは次のとおりです。4。

次のコマンドを試してみましたが、何も機能しませんでした。

grep -Eo '[0-9]+|' filename | sort -u | wc -l

awk -F '|' '{sub(/[^[:digit:]]+/, "", $1); a[$1]} END{for (z in a) ++i; print i}' filename

awk -F '|' '{sub(/[^[:digit:]]+/, "", $1); PRINT[$1]} END{for (z in a) ++i; print i}' filename

wc -l filename | sed 's/ *\([0-9]* \).*/\1/'

答え1

これは最も近いものです:

grep -Eo '[0-9]+|' filename | sort -u | wc -l

しかし目標を逃した

  • 行の先頭に一致を固定しないでください。
  • 照合順序/不要な重複排除

式を固定するには、"^"パターンの先頭に式を入れて「|」をエスケープします(メタ文字であるため)。

grep -Eo '^[0-9]+\|' filename | sort -u | wc -l

Next - 廃棄sort -u.grepは連続した行を無視し、追加情報を使用すると実際には重複していないいくつかの「重複」を削除するようです。

最後に、以下を削除しますwc -lPOSIX grep-c一致数を印刷するようにgrepに指示するオプションがあります。この-oオプションを削除してください(必須ではありません)。だからあなたに必要なこと

grep -Ec '^[0-9]+\|' filename

答え2

これはうまくいくかもしれません

grep -c ^the desired string filename
wc -l thefile

関連情報