特定のコマンドの出力から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] }'
sed
sup
ファイルの最初の行から最後まですべての行を印刷します。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が回答を更新しました。 :)