정렬 된 작은 스 크 립 트

5123 단어 shell파일 설명자
CU 포럼 의 한 문제... 마침 대본 을 배우 고 있 었 습 니 다. 괴 롭 혔 습 니 다. OK, 기록 하 세 요.
질문:
두 파일 의 첫 번 째 열 이 같 으 면 각 줄 이 첫 번 째 열 을 제외 하고 같은 수의 개 수 를 얻어 야 합 니 다. 예 를 들 어

  
  
  
  
  1. ~$ cat kkk
  2. 1 2 3 
  3. 2 9 8 3 
  4. 3 6 7 8 5 
  5. 4 3 5 1 
  6. 5 8 

  
  
  
  
  1. cat ddd
  2. 1 3 2 
  3. 2 8 9 1 
  4. 3 6 8 9 5 
  5. 4 3 2 
  6. 5 9 2 

원 하 는 결과

  
  
  
  
  1. $ cat sort.txt 
  2. 1       2 
  3. 2       2 
  4. 3       3 
  5. 4       1 
  6. 5       0 


결과 에서 첫 번 째 열 은 파일 의 첫 번 째 열 이 고 두 번 째 열 은 두 파일 의 각 열 에 중복 되 는 개수 입 니 다. 예 를 들 어 결과 에서 첫 번 째 줄 의 두 번 째 열 은 d. txt 첫 번 째 줄 과 e. txt 첫 번 째 줄 로 첫 번 째 열 을 제외 하고 두 개의 숫자 가 중복 되 어 얻 은 것 입 니 다.
스 크 립 트:

   
   
   
   
  1. #!/bin/bash 
  2. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin 
  3. export PATH 
  4.  
  5. Var_file1=`mktemp /tmp/tmp.XXXXXXX` 
  6. Var_file2=`mktemp /tmp/tmp.XXXXXXX` 
  7. Var_id=`mktemp /tmp/tmp.XXXXXXX` 
  8. Var_sort=`mktemp /tmp/tmp.XXXXXX` 
  9.  
  10. cut -d ' ' -f 2- $1 > $Var_file1 
  11. cut -d ' ' -f 2- $2 > $Var_file2 
  12. cut -d ' ' -f 1 $2 > $Var_id 
  13.  
  14. while read -u 3 Var_a; read -u 5 Var_b 
  15. do 
  16.     echo ${Var_a} ${Var_b} | sed 's: :
    :g'
     | sort | uniq -d |wc -l >> 
    $Var_sort 
  17. done 3<$Var_file1 5<$Var_file2 
  18. paste $Var_id $Var_sort>sort.txt 
  19. rm -f $Var_file1 $Var_file2 $Var_id $Var_sort 


这个脚本用到了文件描述符,同时对两文件实现读取...记录一下...

如果用awk有更简单的办法,其它兄弟的


    
    
    
    
  1. awk 'NR==FNR{for(i=2;i<=NF;i++){a[FNR","i]=$i;b[FNR]=NF}}NR>FNR{n=0;for(i=2;i<=NF;i++)for(j=1;j<=b[FNR];j++)if($i==a[FNR","j])n++;print $1,n}' kkk ddd

awk还没熟悉到这个地步...学习中.... 还有管道命令,其它兄弟的 

     
     
     
     
  1. while read line; do echo "${line%% *} $(echo "${line#* }" | tr ' ' '
    ' | sort | uniq -d | wc -l)"
    ; done < <(join ddd kkk) 
read 명령 참조:
- p | & (파이프, & 의 기호 이름) 로 Korn 셸 이 실행 하 는 프로 세 스 의 출력 을 읽 어 입력 합 니 다.
주: - p 로고 의 파일 끝 자 는 이 프로 세 스 를 삭제 하기 때문에 다른 프로 세 스 가 생 성 됩 니 다.
- r 읽 기 명령 을 지정 하여 제어 문자 가 아 닌 입력 줄 의 일부분 으로 처리 합 니 다.
- s 입력 을 명령 으로 Korn 셸 의 과거 기록 파일 에 저장 합 니 다.
- u [n] 한 자릿수 파일 설명 기호 n 을 읽 어 입력 합 니 다.파일 설명 자 는 ksh exec 내 장 된 명령 으로 열 수 있 습 니 다.n 의 부족 한 값 은 0 이 고 키 보드 를 나타 낸다.값 2 는 표준 오 류 를 나타 낸다.
 
 
 

좋은 웹페이지 즐겨찾기