다음과 같은 파일이 있습니다.
1 2 3 4 5
0.05775 0.00238 0.02514 0.00469 0.01882
0.26868 0.04114 0.09359 0.02155 0.01367
0.11413 0.00907 0.04032 0.02487 0.01156
0.03759 0.00624 0.00819 0.01527 0.01128
0.09910 0.03416 0.02280 0.00627 0.00433
6 7 8 9 10
0.01798 0.00035 0.00672 0.02180 0.00184
0.01880 0.00834 0.04975 0.05503 0.00234
0.00242 0.00618 0.04936 0.02320 0.00269
0.00931 0.00611 0.02371 0.00299 0.00353
0.00763 0.00197 0.00673 0.00338 0.00182
11 12 13 14 15
0.00330 0.00521 0.00495 0.00426 0.00403
0.01121 0.02891 0.02162 0.02235 0.01534
0.01081 0.01871 0.00888 0.01835 0.00867
0.00684 0.00965 0.00645 0.00802 0.00317
0.00671 0.00333 0.00376 0.00204 0.00028
이 예에는 세 가지 주요 정보가 포함되어 있습니다. 각 블록의 첫 번째 행에는 항상 정수가 포함되고 다른 행에는 소수가 포함됩니다. 각 블록의 처음 4개 행을 가져오고 싶습니다.
산출:
1 2 3 4 5
0.05775 0.00238 0.02514 0.00469 0.01882
0.26868 0.04114 0.09359 0.02155 0.01367
0.11413 0.00907 0.04032 0.02487 0.01156
6 7 8 9 10
0.01798 0.00035 0.00672 0.02180 0.00184
0.01880 0.00834 0.04975 0.05503 0.00234
0.00242 0.00618 0.04936 0.02320 0.00269
11 12 13 14 15
0.00330 0.00521 0.00495 0.00426 0.00403
0.01121 0.02891 0.02162 0.02235 0.01534
0.01081 0.01871 0.00888 0.01835 0.00867
sed로 뭔가를 하려고 하는데 성공하지 못했습니다.
답변1
나는 물었다:
모든 블록에 헤더 행이 있고정확히5개 요소 데이터? 아니면 일부 행에 가변 금액이 있나요?
그렇다면정확히블록당 6줄을 사용하면 다음을 사용할 수 있습니다.
sed -n 'N;N;N;p;N;N' file.txt
그러나 그렇지 않은 경우 다음을 사용하십시오.
sed -n '/\./!{N;N;N;p;}' file.txt
후자의 명령은 마침표가 없는 줄을 만나면 해당 줄과 다음 세 줄을 인쇄합니다(마침표가 있는지 확인하지 않고). 그런 다음 마침표가 없는 다른 줄을 만날 때까지 다음 줄을 건너뜁니다.
가능하다면 이 데이터를 제공하는 도구를 수정하여 보다 합리적인 형식으로 제공되도록 하는 것이 좋습니다.
답변2
$ awk -v RS='\n ' '{
count=split($0,lines,/\n/);
lines[1]=" "lines[1];
max=4 ; if (count < max) { max = count };
for (i=1; i <= max; i++) print lines[i];
}' input
1 2 3 4 5
0.05775 0.00238 0.02514 0.00469 0.01882
0.26868 0.04114 0.09359 0.02155 0.01367
0.11413 0.00907 0.04032 0.02487 0.01156
6 7 8 9 10
0.01798 0.00035 0.00672 0.02180 0.00184
0.01880 0.00834 0.04975 0.05503 0.00234
0.00242 0.00618 0.04936 0.02320 0.00269
11 12 13 14 15
0.00330 0.00521 0.00495 0.00426 0.00403
0.01121 0.02891 0.02162 0.02235 0.01534
0.01081 0.01871 0.00888 0.01835 0.00867
스크립트 awk
는 각 블록의 헤더 행이 최소한 두 개의 공백으로 시작하는 반면 데이터 행은 그렇지 않다는 사실을 활용합니다. 레코드 구분 기호( RS
)를 개행 문자와 공백 두 개로 설정하면 각 청크를 개별적으로 처리할 수 있습니다.
그런 다음 각 블록은 별도의 행으로 나뉩니다. 첫 번째 줄 앞에 두 개의 공백 문자가 옵니다(레코드 구분 기호가 차지하는 공간을 대체하기 위해). 그런 다음 처음 4줄이 인쇄됩니다(또는 블록에 4줄 미만이 있는 경우 그 이하).