100개 행 중 99개 행 건너뛰기

100개 행 중 99개 행 건너뛰기

많은 로그 텍스트 출력을 생성하는 bash 명령 파이프라인이 있습니다. 그러나 대부분의 경우 이전 행을 반복하므로 기본 출력 데이터는 타임스탬프와 일부 사소한 플래그를 제외하고 몇 시간에 한 번만 변경됩니다. 향후 처리/연구를 위해 이 출력을 텍스트 파일로 저장해야 합니다. 각 X의 첫 번째 줄만 인쇄하려면 무엇으로 파이프해야 합니까?

답변1

첫 번째 줄을 인쇄 하고 N 줄마다 다음 N-1 줄을 건너뜁니다.

awk -v N=100 'NR%N==1' infile

시험:

$ seq 1000 |awk -v N=100 'NR%N==1'
1
101
201
301
401
....

건너뛰려는 행 수를 전달하기 위해 매개변수에서 해당 숫자를 읽을 수도 있습니다.

$ seq 1000 |awk -v Num=100 -v Skip=98 '(NR-1)%Num<Num-Skip'
1
2
101
102
201
202
301
302
401
402
501
502
601
602
701
702
801
802
901
902

답변2

@αГsнιι는 이미 요청한 작업(특정 줄 수 건너뛰기)을 수행하는 방법을 보여줬지만 대신 "타임스탬프 및 일부 사소한 플래그"만 다른 후속 줄을 인쇄하는 것이 더 나을 것 같습니다. 건너뛸 행 수입니다. 그렇다면 이러한 "타임스탬프 및 일부 사소한 플래그"가 필드 3, 6, 8 및 17에 저장되어 있으면 어떻게 해야 합니까?

awk '
{
    origRec = $0
    $3=$6=$8=$17=""
    currKey = $0
}
currKey != prevKey {
    print origRec
    prevKey = currKey
}
' file

위의 내용을 쉽게 조정하여 유사한 각 그룹의 첫 번째 줄뿐만 아니라 마지막 줄도 인쇄할 수 있으므로 첫 번째 및 마지막 타임스탬프(유용한 경우)를 볼 수 있으며/또는 여러 유사한 그룹의 인쇄 수를 추가할 수 있습니다. 건너뛰는 줄.

답변3

GNU 사용 split:

$ split -n r/1/100 input

seq또는 테스트를 위해 다음을 사용할 수 있습니다 jot:

$ jot 500 | split -n r/1/100 
$ seq 500 | split -n r/1/100 

## 1
## 101
## 201
## 301
## 401

~에서 coreutils:

r/k/n 동일하지만 출력만 가능케이첫 번째N표준 출력으로

-n r/1/100매 100줄 중 첫 번째 줄만 인쇄됩니다.
-n r/2/100100줄마다 두 번째 줄도 인쇄됩니다 .

외에는 아무것도 하지 않았어약간명령이 변경되었습니다.답변.

그리고 perl:

$ perl -ne 'print if $_ % 100 == 1' input

이것은 다음에 설명된 것과 유사한 Perl 명령입니다.이 답변.

답변4

seq 1000| awk -v x=1 'NR==x{print ; x=NR+100}'

산출

1
101
201
301
401
501
601
701
801
901

관련 정보