파일의 두 줄을 병합하고 줄 끝에 숫자를 추가합니다.

파일의 두 줄을 병합하고 줄 끝에 숫자를 추가합니다.

다음 형식의 큰 텍스트 파일 abc.txt가 있습니다.

BALT
-6.110
130.600
4.06874414
-0.03254425
BALT
-6.620
154.460
3.92286595
-0.17842244
BARM
32.740
140.680
3.94326190
-0.15802649

출력 파일 xyz.txt를 다음 형식으로 변환하려면 이 파일이 필요합니다.

BALT 1
 -6.110 130.600
 4.06874414
 -0.03254425
BALT 2
 -6.620 154.460
 3.92286595
 -0.17842244
BARM 3
 32.740 140.680
 3.94326190
 -0.15802649

데이터가 많아질수록 데이터 이름 4글자 뒤의 숫자 1, 2, 3...이 늘어나게 됩니다.

답변1

이것은 한 줄입니다:

# sed 's/^[A-Z]/>&/' abc.txt | awk -v RS='>' 'NR>1 {printf("%s %d\n %s %s\n %s\n %s\n",$1,NR-1,$2,$3,$4,$5)}' > xyz.txt

생성된 출력은 다음과 같습니다.

# cat xyz.txt 
BALT 1
 -6.110 130.600
 4.06874414
 -0.03254425
BALT 2
 -6.620 154.460
 3.92286595
 -0.17842244
BARM 3
 32.740 140.680
 3.94326190
 -0.15802649

세부 사항:

첫 번째 부분 - 줄의 sed 부분은 각 레코드의 시작 부분에 임의의 특수 문자를 추가합니다(레코드는 이름 뒤에 4개의 숫자가 옵니다). 녹음을 시작하려면 ">"를 선택했습니다. 이렇게 하면 awk를 사용한 처리가 쉬워집니다.

파트 2 - 각 레코드에 대해 지정한 새 형식으로 필드를 인쇄하면 됩니다. 유일한 특이한 점은 시작 부분에 추가 빈 레코드가 있다는 것입니다. 이를 건너뜁니다(NR>1).

답변2

두 가지 작업이 있습니다. 적절한 줄 수를 계산하고 출력 형식을 지정합니다.

nl -bp[A-Z] -nln abc.txt | 
sed '
     /^\w/{
           s/\(.*\)\(....\)/\2 \1/
           n
           N
           s/\n\s*/ /
          }
     s/^\s*/ /
    ' > xyz.txt

아니면 당신이 좋아한다면awk

awk '
     /[A-Z]/ {
             print $0, ++count
             getline
             printf " %s", $0
             next
     }
     {
             print "", $0
     }
    ' abc.txt > xyz.txt

관련 정보