Shell 은 텍스트 를 다시 고 치 며 원래 의 순 서 를 조작 합 니 다.

3010 단어
쉽게 말 하면 이 기 교 는 다음 과 같은 장면 에 대응 된다.
다음 과 같은 텍스트 가 있다 고 가정 합 니 다.
 
  
cccc
aaaa
bbbb
dddd
bbbb
cccc
aaaa

지금 은 그것 을 다시 처리 해 야 합 니 다. 이것 은 아주 간단 합 니 다. sort - u 는 해결 할 수 있 습 니 다. 그러나 만약 에 제 가 텍스트 의 원래 순 서 를 유지 하고 싶다 면 예 를 들 어 여기에 두 개의 aaaa 가 있 습 니 다. 저 는 두 번 째 aaaa 를 없 애고 싶 을 뿐 입 니 다. 첫 번 째 aaaa 는 bbbb 앞 에 있 습 니 다. 다시 한 후에 도 그 앞 에 있어 야 합 니 다. 그래서 제 가 기대 하 는 출력 결 과 는?
 
  
cccc
aaaa
bbbb
dddd

물론 이 문제 자 체 는 어렵 지 않 습 니 다. C++ 또는 python 으로 쓰 는 것 도 쉽 지만, 살기 라 는 것 은 소 칼 을 사용 하 는 것 입 니 다. 셸 명령 으로 해결 할 수 있 을 때, 그것 은 영원히 우리 의 최 우선 선택 입 니 다.답 은 마지막 에 드 리 겠 습 니 다. 제 가 어떻게 생각 했 는 지 말씀 드 리 겠 습 니 다.
우 리 는 때때로 자신의 디 렉 터 리 를 환경 변수 PATH 에 추가 하려 고 할 때 ~/. bashrc 파일 에 이렇게 씁 니 다. 예 를 들 어 가입 할 디 렉 터 리 는 $HOME/bin 입 니 다.
 
  
export PATH=$HOME/bin:$PATH

이렇게 해서 우 리 는 PATH 에 경 로 를 추가 한 것 과 같 습 니 다. $HOME/bin 디 렉 터 리 는 맨 앞에서 검색 되 지만 source ~/. bashrc 를 실행 하면 $HOME/bin 디 렉 터 리 는 PATH 에 추 가 됩 니 다. 다음 에 디 렉 터 리 를 추가 하면 예 를 들 어
 
  
export PATH=$HOME/local/bin:$HOME/bin:$PATH

source ~/. bashrc 를 실행 할 때 $HOME/bin 디 렉 터 리 는 PATH 에 두 개의 기록 이 있 습 니 다. 이것 은 사용 에 영향 을 주지 않 지만 강박 증 에 있어 서 는 참 을 수 없습니다. 그래서 문 제 는 $PATH 에서 중복 되 는 경 로 를 제거 하고 원래 의 경로 순서 가 변 하지 않 습 니 다. 즉, 원래 누가 앞 에 있 었 는 지, 무 거 운 후에 도 여전히 앞 에 있 었 습 니 다.셸 명령 을 실행 할 때 첫 번 째 경로 부터 찾 기 때문에 순서 가 중요 합 니 다.
자, 이렇게 많은 말 을 했 습 니 다. 우 리 는 최종 결 과 를 밝 히 겠 습 니 다. 글 에서 시 작 된 데 이 터 를 예 로 들 어 입력 파일 이 in. txt 라 고 가정 하고 명령 은 다음 과 같 습 니 다.
 
  
cat -n in.txt | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2-

이것들 은 모두 매우 간단 한 셸 명령 입 니 다. 다음은 잠시 설명 하 겠 습 니 다.
 
  
cat -n in.txt : 输出文本,并在前面加上行号,以\t分隔
sort -k2,2 -k1,1n : 对输入内容排序,primary key是第二个字段,second key是第一个字段并且按数字大小排序
uniq -f1 : 忽略第一列,对文本进行去重,但输出时会包含第一列
sort -k1,1n : 对输入内容排序,key是第一个字段并按数字大小排序
cut -f2- : 输出第2列及之后的内容,默认分隔符为\t

첫 번 째 명령 부터 차례대로 조합 하여 실제 출력 효 과 를 보면 더욱 쉽게 이해 할 수 있다.$PATH 의 중복 경 로 는 어떻게 처리 해 야 합 니까? 아니면 앞의 예 로 전후 에 tr 로 전환 하면 됩 니 다.
 
  
export PATH=$HOME/local/bin:$HOME/bin:$PATH
export PATH=`echo $PATH | tr ':' '
' | cat -n | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2- | tr '
' ':'`

사실 이렇게 PATH 를 사용 하면 문제 가 있 습 니 다. 예 를 들 어 우리 가 상기 명령 을 실행 한 후에 $HOME/bin 이라는 경 로 를 없 애 려 면 다음 과 같은 내용 으로 만 수정 하 는 것 이 부족 합 니 다.
 
  
export PATH=$HOME/local/bin:$PATH
export PATH=`echo $PATH | tr ':' '
' | cat -n | sort -k2,2 -k1,1n | uniq -f1 | sort -k1,1n | cut -f2- | tr '
' ':'`

$HOME/bin 을 $PATH 에 추가 하 였 습 니 다. 이것 은 삭제 하 는 역할 을 하지 않 았 기 때 문 입 니 다. 아마도 가장 좋 은 방법 은 모든 경 로 를 알 고 추가 적 인 방식 이 아 닌 지정 을 표시 하 는 것 일 것 입 니 다.

좋은 웹페이지 즐겨찾기