実行でき、うまくいきました。注:$ 1フィールドは、時間/日付スタンプが付けられたフィールドです。
gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog | sort | uniq -c | sort -r
57339 2014-03-21 09
54290 2014-03-21 08
54036 2014-03-21 10
53254 2014-03-21 11
52777 2014-03-21 12
50785 2014-03-21 07
49729 2014-03-21 16
44459 2014-03-21 15
43932 2014-03-21 13
43335 2014-03-21 06
40952 2014-03-21 14
40864 2014-03-21 17
今私が望むのは、最初の10行(#の前にコメントがある)を隠すことです。これは異なる場合があります。したがって、#で始まる最初のxx行を見つけようとしています。
スクリプトを次のように変更します。
gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog | sort | uniq -c | sort -r | gawk -v MyID="$id" '/#/{n++}; END {print n+0}' | gawk "NR> MyID "
しかし、これはうまくいきません。いくつかをさらに変更すると、希望の結果が得られます。
gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog | gawk "NR>10" | sort | uniq -c | sort -r
実際、10を入力して最初の10行または20行をスキップできることを知っています。しかし、私はこれが計算された値であることを願っています。
答え1
次のawk
コードは最初のコメントだけをスキップし、print $1
残りの行はスキップします。
gawk -F: -v c=1 '/^[^#]/ {c=0} c==0 { print $1 }' ourlog
プログラムが開始される前に、この変数はc
1に設定されます。コメント以外の行が見つかると、この変数はc
ゼロに設定され、残りの実行中はそのまま残ります。この時点でc==0
print文が実行されます。
すべてのコメントを削除したい場合は、コードははるかに簡単です。
gawk -F: '/^[^#]/ { print $1 }' ourlog
上記のコードは、正規表現と比較して各行をチェックし、^[^#]
最初の文字ではない場合にのみ一致します#
。一致するもの(コメントではなく行)がある場合は、printステートメントが実行されます。
答え2
もともと文が文法的な問題に修正されたので…
今朝まで考えられなかったこの問題を解決する別の方法があります。
sed "/#/d" "/cygdrive/c/!chkout/ourlog" | gawk -F ":" "{print $1}" | sort | uniq -c | sort -r
答え3
実際の入力を表示せずに、目的の出力とさまざまな段階で使用されるさまざまなコードのみを表示するので、何をしたいのかわかりません。しかし、次のことはあなたの要件を満たすと思います。 (必ず-F:
コマンドラインで設定する必要があります。そうでない場合は、修正方法がわかるように各部分を説明します。
!/^#/ { # do the following on all rows that don't begin
# with `#`
a[$1]++ # store column 1 as the key in an array and
# increment the value for each occurrence
}
END { # do the following after reading the entire file
PROCINFO["sorted_in"] = "@ind_num_desc"; # set array traversal as numeric index descending
# (requires gawk >= 4.0, otherwise, additional code
# will be needed)
for (i in a) { # loop through the array setting i as the index of
# the current entry
print a[i], i; # print the value (row count) and the index (the
# row)
}
}
変数はスキップする最初のコメント行数を決定するために使用されるように見えるので、これ以上変数を渡す必要はないと思います。しかし、そうしたい場合は、ほとんどの例に含まれていますが、呼び出すたびにgawk
、これは新しいインスタンスです。変数を使用するインスタンスの前に、インスタンスに変数を渡します。したがって、上記の例では、次のように変更する必要があります。
gawk -F ":" "{ print $1 }" /cygdrive/c/counting/ourlog \
| sort | uniq -c | sort -r \
| gawk '/#/{n++}; END {print n+0}' \
| gawk -v MyID="$id" "NR> MyID "
しかし、これらすべてを組み合わせることができます。最後の2行は行数を計算#
し、その値を別のインスタンスに渡そうとしますが、STDOUTとして印刷するので、どのように機能するのかわかりません。したがって、awkが次の行をスキップするように最初の行を修正してください。
gawk -F: '!/^#/ { print $1 }' /cygdrive/c/counting/ourlog \
| sort | uniq -c | sort -r
それがあなたが望むものであり、すべてのパイプを避けたい場合は、上記のコードが機能します。