連続した数字で項目をグループ化します。

連続した数字で項目をグループ化します。

以下の一連のファイルがあり、それを「隣接グループ」にグループ化する必要があります。各行は数字で始まり、下の次の行が数字と同じかそれより小さい場合は、ファイルを上から下に読み取る必要があります。上記1.彼らは一緒に「グループ化」しなければならず、複数の行が一緒にある場合も同様です。

最終目標は、各グループに最も近い数字が1以上の異なるファイルの各「グループ」から数字を生成することです。以下のサンプルファイルの下に必要な出力を表示しました。

78' Corner, Bristol City. Conceded by Wes Hoolahan.
75' Corner, Bristol City. Conceded by Ahmed Hegazi.
60' Corner, Bristol City. Conceded by Ahmed Hegazi.
51' Corner, Bristol City. Conceded by Sam Johnstone.
20' Corner, West Bromwich Albion. Conceded by Niki Mäenpää.
19' Corner, West Bromwich Albion. Conceded by Adam Webster.
13' Corner, Bristol City. Conceded by Ahmed Hegazi.
7' Corner, Bristol City. Conceded by Sam Johnstone.
2' Corner, Bristol City. Conceded by Sam Johnstone.

全体的な目標は、1つ以上の行から一致するアイテムの総数を取得することです。したがって、ファイルには簡単ですwc -l。マッチ。

したがって、上記の例では、「19&20」を一緒にグループ化する必要があり、合計数は8つの「独立」行になります。 (線は他の数字と1以上の差があると独立したものとみなされます。)

たとえば、上記の例で21で始まる行がある場合、「19&20」ヒットにグループ化されているため、出力はまだ8になります。 「19と同じ数の行もあるかもしれません。&19インチ。」

要件を考慮するために、より複雑なスクリプトを書かずにこれがどれほど可能かはわかりませんが、時間に印象的なsed / awk行を見たことがあるので、そのうちの1つが機能する可能性があります。

答え1

データファイルはすでにソートされているので、各行の最初の値(最初の行以降)を前の値と比較するだけです。数値が変換されたことを確認してください。したがって、(コメントで提案したように)必要なものが数だけであれば、次のようにすることができます。

awk '
  BEGIN { if(getline == 1) {last = $1+0; c = 1}}
  last - $1 > 1 {c++} 
  {last = $1+0} 
  END {print c}
' file

答え2

ENDFILE を処理するには、GNU awk を使用します。

$ cat tst.awk
FNR==1 { prev=$1; cnt=1; fname=FILENAME; next }
(prev - $1) > 1 { cnt++ }
{ prev = $1 }
ENDFILE { print fname, cnt }

$ awk -f tst.awk *
file1 8
file2 3
file3 24

いくつかの奇妙な場合:

$ cat tst.awk
FNR==1 {
    if ( NR > 1 ) {
        print fname, cnt
    }
    prev = $1
    cnt = 1
    fname = FILENAME
    next
}
(prev - $1) > 1 { cnt++ }
{ prev = $1 }
END { print fname, cnt }

関連情報