빅 데이터를 위해 텍스트 파일을 분할하고 이름을 지정하는 방법(콘텐츠 줄 수 기준)은 무엇입니까?

빅 데이터를 위해 텍스트 파일을 분할하고 이름을 지정하는 방법(콘텐츠 줄 수 기준)은 무엇입니까?

Linux 시스템에 1000개의 텍스트 파일이 있고 각 텍스트 파일의 이름에는 접두사( OG00*)가 있고 9개의 고유 ID가 포함되어 있습니다. 텍스트 파일 이름으로 각 ID에 대한 텍스트 파일을 만들고 싶습니다.OG0012637_1.txt, OG0012637_2.txt, OG0012637_3.txt, OG0012637_4.txt, OG0012637_5.txt....OG0012637_9.txt

Input:
$ cat OG0012637.txt
        TRINITY_DN9932_c0_g2_i1.p1
        TRINITY_DN17663_c0_g1_i1.p1
        TRINITY_DN6645_c0_g1_i2.p1
        TRINITY_DN2462_c0_g1_i2.p1
        TRINITY_DN19713_c3_g1_i2.p1
        TRINITY_DN4587_c0_g1_i1.p1
        TRINITY_DN4405_c0_g1_i1.p1
        TRINITY_DN7191_c1_g2_i1.p1
        TRINITY_DN1740_c0_g1_i2.p1

필수 출력 파일:

$ cat OG0012637_1.txt
 TRINITY_DN9932_c0_g2_i1.p1
$ cat OG0012637_2.txt
 TRINITY_DN17663_c0_g1_i1.p1
$ cat OG0012637_3.txt
 TRINITY_DN6645_c0_g1_i2.p1
$ cat OG0012637_4.txt
 TRINITY_DN2462_c0_g1_i2.p1
$ cat OG0012637_5.txt
 TRINITY_DN19713_c3_g1_i2.p1
$ cat OG0012637_6.txt
 TRINITY_DN4587_c0_g1_i1.p1
$ cat OG0012637_7.txt
 TRINITY_DN4405_c0_g1_i1.p1
$ cat OG0012637_8.txt
 TRINITY_DN7191_c1_g2_i1.p1
$ cat OG0012637_9.txt
 TRINITY_DN1740_c0_g1_i2.p1

답변1

이러한 작업을 위해 만들어진 도구/유틸리티는 다음과 같습니다.나뉘다. 이 GNU버전에는 사용 사례에 적합한 옵션이 있습니다.

for f in OG00*.txt; do
split -l1 -a1 -e --additional-suffix=.txt  --numeric-suffixes=1  "$f" "${f%????}_" 
done

산출

.
├── OG0012637_1.txt
├── OG0012637_2.txt
├── OG0012637_3.txt
├── OG0012637_4.txt
├── OG0012637_5.txt
├── OG0012637_6.txt
├── OG0012637_7.txt
├── OG0012637_8.txt
├── OG0012637_9.txt
└── OG0012637.txt
  • -l1파일은 한 줄에 하나씩 분할되어야 합니다.
  • -a1처리할 생성된 파일은 9개뿐이므로 숫자 길이는 한 자리로 유지되어야 합니다.
  • --numeric-suffixes출력 파일의 번호는 기본값 0이 아닌 1부터 시작해야 합니다.
  • --additional-suffix기본적으로 아무것도 추가하지 않고 .txt를 출력 파일에 추가해야 합니다.
  • 접두사는 기본 xa가 아닌 밑줄이 붙은 기본 이름입니다.

답변2

GNU 분할 구현에 액세스할 수 없으면 awk를 사용하세요.

awk '
  FNR==1 {
    basename = substr(FILENAME,1,length(FILENAME)-4)
  } 
  {
    outfile = basename "_" FNR ".txt"; print > outfile; close(outfile)
  }
' OG*.txt

관련 정보