2014-07-07 1 views
0

병합 된 파일을 두 개의 파일로 분리하고 싶습니다. 이 파일은 :병합 된 파일에서 파일을 추출하는 방법

file.dat 

i =100 
1 2 3 
i =1 
-1 -2 -3 
i =101 
1 2 3 
i =102 
1 2 3 
i =103 
1 2 3 
i =2 
-1 -2 -3 
.... 

혼합 지수는

1,2,3,4, ...,99 

100, 101, 102, 103,...,200. 

지수가 번갈아 나타납니다,하지만 규칙이 없습니다. 데이터

1 2 3 

-1 -2 -3 

다만 각 단계에서 상기 데이터 블록을 나타낸다.

인덱스와 관련하여 병합 된 파일을 두 개의 파일로 분리 할 생각을 해 주시겠습니까? 당신은 단지 두 개의 서로 다른 파일이 속한 인덱스의 어느 그룹에 따라 추가 데이터 블록을 원하는 경우에

+0

인덱스별로 데이터를 정렬 하시겠습니까? (이것은 여러 줄로 된 레코드 문제입니다) – kev

+0

답장을 보내 주셔서 감사합니다! 파일을 두 개의 파일로 분리하고 싶습니다. 각각은 색인 선 "i = .."과 함께 있습니다. – jiadong

+0

예상되는 결과는 무엇입니까? –

답변

1

이 작동합니다 :

# separate.awk 

{ 
    if ($1 == "i") 
    { 
    split($2,a,"="); 
    i = a[2]; 
    } 

    if (i < 100) 
    print > "1-99.dat"; 
    else 
    print > "100-200.dat" 
} 

$ awk -f separate.awk file.dat 

$ cat 1-99.dat 
i =1 
-1 -2 -3 
i =2 
-1 -2 -3 

$ cat 100-200.dat 
i =100 
1 2 3 
i =101 
1 2 3 
i =102 
1 2 3 
i =103 
1 2 3 
+0

이 출력의 경우 문자 그대로 'awk'{f = "1-99.dat"}/1 2 3/{f = "100-200.dat"} {print> f} '파일'을 사용할 수 있습니다 –

+1

실제 데이터 블록이 모두 같지는 않다고 생각하고 "1 2 3"보다 더 흥미로운 것을 포함합니다. – Pontus

+0

@ Pontus '1 2 3'이 더 많은 것을 나타내는 것은 사실입니다. 각 블록 앞에'i = **'줄을 유지하고 싶다면? 각 블록 앞에 추가 할 수 없다는 것을 알고 있습니까? 감사. – jiadong

1

awk가 그것을해야 너 :

awk -F= '/=/{f="a.txt";if($2>99)f="b.txt";next} {print >f}' file.dat 

우선, 필드 구분자를 =으로 설정합니다. 그런 다음 행에 등호가 있는지 확인한 후 등호 뒤에 숫자에 따라 출력 파일의 이름을 "a.txt"또는 "b.txt"로 설정할 시간입니다. 그 다음 후속 레코드에서 마지막으로 선택한 파일에 쓰기 만합니다.

+0

코드 길이를 줄이기 위해 파일 이름을 변경 한 이유가 무엇입니까? –

+0

@Jidder 응? 나는 파일 이름이 요구되는 것의 어떤 명세도 보지 못했다. 나는 그것들을 만들었다. –

+0

그래, 내가 다른 대답을 읽고 그들이 파일 이름이라고 생각하고, 내 잘못을 털어 버렸다. ( –

관련 문제