2019년 2월 13일 수요일

[BASH] cut 명령을 이용하여 파일 이름을 간략하게 정리하기

cut - remove sections from each line of files (print selected parts of lines from each file to standard out)

커맨드 라인에서 man cut이라고 치면 나오는 설명이다. CSV 파일처럼 각 라인이 일정한 구분자(delimiter)로 나뉜 'section'의 집합으로 이루어진 경우, 이를 나누어서 작업하는 데에 아주 적당한 명령이다. 구분자를 제공하지 않으면 라인 내의 위치를 기준으로 잘라내는 것도 가능하다.

cut을 사용하면 NCBI에서 다운로드한 유전체 정보 파일의 이름을 간략히 하는 일이 매우 쉬워진다. RefSeq에서 받은 FASTA 파일의 이름은 다음과 같이 여러 필드가 밑줄('_')로 구분된 형태를 하고 있다.
GCF_000152245.2_ASM15224v2_genomic.fna
GCF_000242675.1_Euba_infi_F0142_V1_genomic.fna
GCF_900100105.1_IMG-taxon_2593339210_annotated_assembly_genomic.fna
굵은 글씨로 표현된 assembly accession 뒤의 정보는 assembly ID로서 제출자가 정하는 것이라서 특별히 정해진 규약이 없다. 그래서 rename 명령어나 $VAR{//문자열} 방법으로 처리하기에 좋지 않다. cut을 사용하면 밑줄을 delimiter로 삼아서 첫번째 및 두번째 섹션을 취한 뒤, 여기에 .fna 확장자를 붙이는 것으로 새 파일의 이름을 정하면 된다. cut을 사용하면 이러한 작업을 매우 간단하게 할 수 있다.


$ ls | while read f
> do
> cp $f $(echo $f | cut -d'_' -f 1,2).fna
> done

더 이상의 무슨 설명이 필요한가? 더욱 많은 사례는 Linux Cut Command With Samples를 방문해 보라.

cut 명령어의 사례를 보면 -f1,2 -f3과 같이 옵션과 지정한 값 사이에 아무런 공백을 넣지 않는 것을 보게 된다. 옵션을 길게 쓰려면 --fields=LIST와 같이 등호('=') 좌우로 공백을 넣지 않는 것이 맞다. 그러나 짧게 쓰는 경우라면 -f 1처럼 사이에 공백을 넣는 것이 자연스럽지 않을까? 실제로 작동을 시켜 보면 -f1과 -f 1 어느 것으로 하든 상관은 전혀 없다. 어쩌면 이러한 관행은 옵션을 인수(여기에서는 작업 대상 파일명)와 명확히 구분하기 위함인지도 모른다. 옵션과 인수(argument)는 다름에 유의해아 한다. 옵션은 명령의 실제 동작을 세부적으로 조절하는 것이고, 인수는 작업이 이루어지는 대상이다.

댓글 없음: