동일한 처음 2자로 시작하는 줄을 추출한 다음 별도의 파일로 출력하려면 어떻게 해야 합니까?

동일한 처음 2자로 시작하는 줄을 추출한 다음 별도의 파일로 출력하려면 어떻게 해야 합니까?

매우 큰 텍스트 목록이 있고 동일한 2자로 시작하는 줄을 추출한 다음 해당 두 문자의 이름을 딴 별도의 파일에 해당 줄을 저장하는 방법이 필요합니다.

예시 목록:

abWEye7kgw7  
abff34ZSrZf  
abke8mzMyma  
b2R5mPZGbCb  
b2zhhCeLZzZ  
b2q2T5rkACp  
k9ekzbc8nUh  
k9QzXBUrNT7  
k92RtdXntZ3  
vrTtR9GmbWG  
vraVM9QXWzY  
vrME9QnksBf  

원하는 출력:

ab* > ab.txt  
b2* > b2.txt  
k9* > k9.txt  
vr* > vr.txt

목록은 상당히 크고 처음 두 문자의 조합이 많습니다.

답변1

$ awk '{ f = substr($0,1,2) ".txt"; print >f }' file.in

$ ls
ab.txt  b2.txt  file.in k9.txt  vr.txt

$ cat ab.txt
abWEye7kgw7
abff34ZSrZf
abke8mzMyma

이 문제는 분명히 셸에서도 해결될 수 있지만 awk텍스트 파일을 구문 분석하는 데 더 적합합니다. substr()입력 파일의 각 줄에서 처음 두 문자를 선택 하고 끝에 f추가된 변수에 할당합니다. 현재 행을 이름이 지정된 파일로 출력 .txt합니다 .printf

변수를 취소하고 나중에 표현식을 직접 사용할 수 있다고 생각합니다 f. 그러나 OpenBSD에서 사용하는 구현에서는 그렇지 않습니다(버그일 수 있음).substr()>awk


첫 번째 두 문자의 서로 다른 조합이 너무 많으면 열린 파일이 너무 많아 문제가 발생할 수 있습니다.

다음 변형을 사용하면 이 문제가 해결됩니다.

awk '{ f = substr($0,1,2) ".txt"; print >>f; close(f) }' file.in

답변2

awk해결책:

awk -v FS='' '{ print > $1$2".txt" }' file

생성된 파일 중 하나:

$ cat k9.txt 
k9ekzbc8nUh
k9QzXBUrNT7
k92RtdXntZ3

답변3

이 시도:

cat list.txt | while IFS= read -r st; do echo $st >> ${st:0:2}.txt; done

답변4

나는 결과를 얻기 위해 다음 방법을 사용합니다. 테스트 잘 되는지 테스트해보세요

 for j in `awk '{print substr($1,1,2)}' k.txt  | uniq -c | awk '$1 >=2 {print $2}'`; do sed -n "/^$j/p" k.txt > $j.txt; done

각 줄의 처음 두 문자를 추출합니다. 1줄 이상에서 처음 2자가 동일한 경우. 관련 줄을 인쇄하고 파일 이름의 처음 2글자에 해당 줄을 저장합니다.

산출

 cat ab.txt
    abWEye7kgw7
    abff34ZSrZf
    abke8mzMyma

    cat b2.txt
    b2R5mPZGbCb
    b2zhhCeLZzZ
    b2q2T5rkACp

     cat k9.txt
    k9ekzbc8nUh
    k9QzXBUrNT7
    k92RtdXntZ3

 cat vr.txt
vrTtR9GmbWG
vraVM9QXWzY
vrME9QnksBf

관련 정보