많은 로그 텍스트 출력을 생성하는 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/100
100줄마다 두 번째 줄도 인쇄됩니다 .
외에는 아무것도 하지 않았어약간명령이 변경되었습니다.답변.
그리고 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