매우 큰 텍스트 목록이 있고 동일한 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
합니다 .print
f
변수를 취소하고 나중에 표현식을 직접 사용할 수 있다고 생각합니다 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