두 번째 열 값을 기준으로 파일 분할

두 번째 열 값을 기준으로 파일 분할

두 번째 열을 기준으로 아래와 같은 파일을 두 개의 파일로 분할하는 데 도움을 주실 수 있나요? (값 1로 시작하는 그룹과 다음 두 줄을 더한 그룹은 하나의 파일에 있어야 하고, 값 0.1로 시작하고 다음 두 줄을 더한 그룹은 하나의 파일에 있어야 합니다. 하나의 파일) 두 번째 파일):

A 1
A 10
A 100
B 0.1
B 1
B 10
C 1
C 10
C 100
D 0.1
D 1
D 10

예상 출력 파일 1:

A 1
A 10
A 100
C 1
C 10
C 100

예상 출력 파일 2:

B 0.1
B 1
B 10
D 0.1
D 1
D 10

감사합니다! !

답변1

$ cat tst.awk
!(c&&c--) {
    out = "out" ($2 == 1 ? 1 : 2)
    c = 2
}
{ print > out }

$ awk -f tst.awk file

$ head out?
==> out1 <==
A 1
A 10
A 100
C 1
C 10
C 100

==> out2 <==
B 0.1
B 1
B 10
D 0.1
D 1
D 10

바라보다인쇄를 위해 sed- 또는 awk-a-line-follow-a-matching-pattern을 사용하십시오.what c&&c--does 및 기타 유사한 awk 관용구에 대한 것입니다.

답변2

다음 awk절차가 작동합니다.

awk '$2=="1"&&!(n+m){n=1}
     $2=="0.1"&&!(n+m){m=1}
     n&&n<4{print > "file1.txt"; if (++n==4) n=0}
     m&&m<4{print > "file2.txt"; if (++m==4) m=0}' input.txt

두 번째 열을 확인하고 해당 값이 1또는 인지 확인합니다 0.1.

  • 그렇다면 1아직 회선 그룹에 속하지 않은 경우 카운터 n는 으로 설정됩니다 1. 이 카운터가 0이 아니지만 미만인 경우 4현재 줄이 인쇄됩니다 file1.txt(시작 줄 및 다음 두 줄과 동일). 지정된 행 수에 도달하면 카운터가 0으로 재설정되어 행 그룹이 완료되었음을 나타냅니다.
  • 두 번째 필드가 있는 줄에서도 마찬가지입니다 0.1. 카운터 m와 출력 파일 만 호출됩니다 file2.txt.
  • 그룹 시작은 아직 그룹 내에 있지 않은 경우에만 확인됩니다(즉, m둘 다 n0임).

답변3

사용 sed:

sed -n \
    -e '/[[:blank:]]1$/    {' -e 'N;N; w file1' -e '}' \
    -e '/[[:blank:]]0\.1$/ {' -e 'N;N; w file2' -e '}' file

file1현재 줄이 공백(공백 또는 탭)으로 끝나는 경우 위 코드는 현재 줄과 다음 두 줄을 1.

file2현재 줄이 공백과 뒤에 오는 경우 0.1코드는 현재 줄과 다음 두 줄을 이름이 지정된 파일에 씁니다.

N명령은 sed입력의 다음 줄을 편집 버퍼에 추가하고 w버퍼의 현재 내용을 지정된 파일에 씁니다.

관련 정보