실행할 수 있었고 잘 작동했습니다. 참고: $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
0으로 설정되고 나머지 실행 동안 그대로 유지됩니다. 이때 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 "
그러나 이 모든 것은 결합될 수 있습니다. 마지막 두 줄은 행 수를 계산 #
하고 해당 값을 다른 인스턴스에 전달하려고 시도하지만 STDOUT으로 인쇄하는 것이므로 어떻게 작동하는지 잘 모르겠습니다. 따라서 awk가 다음 줄을 건너뛰도록 첫 번째 줄을 수정하세요.
gawk -F: '!/^#/ { print $1 }' /cygdrive/c/counting/ourlog \
| sort | uniq -c | sort -r
그것이 당신이 원하는 것이고 모든 파이프를 피하고 싶다면 위의 코드가 작동할 것입니다.