awk는 시간별 합계와 변수를 원합니다.

awk는 시간별 합계와 변수를 원합니다.

실행할 수 있었고 잘 작동했습니다. 참고: $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

프로그램이 시작되기 전에 이 변수는 c1로 설정됩니다. 주석이 아닌 행이 발견되면 이 변수는 c0으로 설정되고 나머지 실행 동안 그대로 유지됩니다. 이때 c==0print 문이 실행됩니다.

모든 주석을 제거하려는 경우 코드가 훨씬 간단합니다.

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 "

그러나 이 모든 것은 결합될 수 있습니다. 마지막 두 줄은 행 수를 계산 #하고 해당 값을 다른 인스턴스에 전달하려고 시도하지만 STDOUT으로 인쇄하는 것이므로 어떻게 작동하는지 잘 모르겠습니다. 따라서 awk가 다음 줄을 건너뛰도록 첫 번째 줄을 수정하세요.

gawk -F: '!/^#/ { print $1 }' /cygdrive/c/counting/ourlog \
    | sort | uniq -c | sort -r

그것이 당신이 원하는 것이고 모든 파이프를 피하고 싶다면 위의 코드가 작동할 것입니다.

관련 정보