쉘 스크립트에서 목록 내용의 번호를 다시 매기지 않고 목록의 번호만 다시 매기는 방법이 있습니까? 예를 들어:
3. cat
1. hat
2. mouse
다음과 같이 변경합니다.
1. cat
2. hat
3. mouse
감사해요.
답변1
간단히:
awk '$1=NR "."'
그러면 첫 번째 필드(공백 앞의 첫 번째 텍스트)가 줄(레코드) 번호와 점으로 변경됩니다. 레코드 번호는 항상 양수이고 0보다 크므로 할당 결과는 항상 true가 되어 행(레코드)이 인쇄될 때 첫 번째 필드가 변경됩니다.
첫 번째 필드가 변경되면 NF(필드 수)와 제로 필드($0)가 다시 계산되어 반복되는 모든 공백을 하나의 공백으로 변환합니다.
즉, 여러 개의 인접한 공백(및 탭)이 있는 줄이 단일 공백으로 병합됩니다.
awk 처리에서 여러 공간을 회수해야 하는 경우에는 더 복잡해집니다(GNU awk에만 patsplit이 있습니다).
awk '{
n=patsplit($0,f,/[^ \t\n]+/,s); # split the line storing whitespace.
f[1] = NR "." # only change actually needed.
for(i=0;i<=n;i++) # for all fields (and separators)
{
printf("%s%s",f[i],s[i]) # print each field and separator.
}
print("") # cause the printing of an OFS
}
' patsplitfile
답변2
cut -d. -f2- input | nl -ba -w 1 -s .
이는 입력에서 선행 숫자와 마침표를 제거한 다음 다음 nl
과 같이 로 파이프합니다.
-ba
--각 행의 수-w 1
-- 열을 사용하여 삽입된 숫자를 저장합니다.-s .
--.
삽입된 숫자와 텍스트 사이의 구분 기호 로 사용됩니다.
샘플 입력:
3. cat
4. some words
1. hat
2. mouse
10. house
9. box
8. fox
7. here
6. there
5. anywhere
출력은 다음과 같습니다
1. cat
2. some words
3. hat
4. mouse
5. house
6. box
7. fox
8. here
9. there
10. anywhere