列の値を計算しますが、一致するパターンが最初に発生した後の行のみを考慮します。

列の値を計算しますが、一致するパターンが最初に発生した後の行のみを考慮します。

特定のコマンドの出力から2番目の列の値を計算する必要があります。しかし、問題は、特定のパターンを含む行の後の行を考慮するだけです。例:
コマンド出力(ptree) -

1234話
   3342枚/空/ユーザー/123/loc
      7783ディナー
         1234アルファベットAAA1 BBB1 CCC1 D444
         0909アルファベットxx11 SD11 lk23 3484
         8383現在のuh9u 38tt kj33 SD99
         3030ジズqq11 11ii 39ii ij33
         0101監督者kk88 sis8 88si mm92
         1020zz098df cv99子供8dhd
         1111監督者9ike 39ei 93je 39de

最初に表示される sup (3 番目の行) を探し、3 番目の行 (類似した値をグループ化するため) の後、2 番目の列 (太字で表示) のすべての値を計算しようとしています。 'sup'が最初に発生する前の行数は固定されておらず、いつでも変更される可能性があります(したがって3にハードコードできません)。

出力は次のようにする必要があります -

abc 2  
cur 1  
zzz 1  
sup 2  
zz0 1  

誰もがこれを行う最良の方法を提案できますか?

答え1

この試み、

 sed -e '1,/sup/d;/^[0-9]/,$d' file.txt | awk 'NF>=3{ a[$2]++ } END { for (n in a) print n, a[n] }'
  • 1,/sup/d古いコンテンツをすべて削除します。sup
  • /^[0-9]/,$d後ろに他のプロセスがある場合は削除されます。sup

答え2

最初のルックアップが記録されたときに「処理スイッチ」を設定でき、supスイッチが設定されている場合にのみ計算されます。

$ gawk '
    /sup/ {p=1} 
    p {a[$2]++} 
    END {
      PROCINFO["sorted_in"] = "@ind_str_asc"; 
      for (i in a) print i, a[i]
    }' file
abc 2
cur 1
sup 3
zz0 1
zzz 1

AwkがPROCINFO配列巡回機能をサポートしていない場合は、外部パイプを介して出力できます。sort

答え3

@msp9011によく似ています

$ sed -n '/sup/,$p' input.txt|awk 'NR>1 {counts[$2]++} END  { for(key in counts) print key, counts[key] }'

sedsupファイルの最初の行から最後まですべての行を印刷します。awk渡された2番目の行から始めて、2番目の列のすべての固有値を計算します。最後に結果を印刷します。

編集:@ msp9011で述べたように、これはそれ以上プロセスがないと仮定します。プロセスを見つけるには、更新されたバージョンは次のとおりです。

$ sed -n '/sup$/,/^[0-9]/p' count.txt|sed -e '1d' -e '$d'|awk '{counts[$2]++} END  { for(key in counts) print key, counts[key] }'

sed数字で終わる行から数字で始まる行まで、supすべての内容を印刷します。その後、最初と最後の行が削除され、awk計算が開始されます。

EDIT2:@msp9011が回答を更新しました。 :)

関連情報