다음 형식의 큰 텍스트 파일 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