다음을 사용하여 2000개 이상의 5K SNP 파일로 분할한 유전자형 파일이 있습니다.
split -d geno_file
내가 얻는 결과는 다음과 같습니다.
table_subset_0001
table_subset_0002
table_subset_0003
.
.
table_subset_0099
.
.
table_subset_0999
0을 제거하고 얻고 싶습니다.
table_subset_1
table_subset_2
table_subset_3
.
.
table_subset_93
.
.
table_subset_999
이를 수행할 수 있는 방법이 있습니까?
답변1
Perl 유틸리티 사용 rename
:
rename 's/_0+/_/' table_subset_*
그러면 _
다음 0개 문자가 로 대체됩니다 _
.
위의 내용은 rename
Perl과 함께 제공되는 유틸리티(때때로 호출됨)와 함께 작동합니다. prename
일부 배포판은 완전히 호환되지 않는 유틸리티 rename
에서 유틸리티를 설치합니다 util-linux
.
Perl의 이름 바꾸기가 시스템에 아직 설치되어 있지 않은 경우 이를 설치하는 방법을 찾을 수 있습니다.여기
답변2
순수함을 위해서...
순수한 bash
답변: (@steeldriver에게 감사드립니다)
shopt -s extglob
for file in table_subset_0*; do
mv "$file" "${file/_+(0)/_}"
done
순수한 GNU sed
답변:
ls | sed -n -r '
/^(table_subset_)0+(.*)/ ! d
s//mv & \1\2/
e
'
순수한 GNU awk
답변:
ls | awk -F '_0+' 'NF > 1 { system("mv " $0 " " $1 "_" $2) }'
답변3
@ John1024의 솔루션에 추가하기 위해 표준 Bash 명령을 사용하는 유사한 솔루션이 있습니다.
for file in table_subset_*; do
new_name=$(echo "$file" | sed -E -e 's/_0+/_/')
mv "$file" "$new_name"
done
원리는 동일합니다. 모든 파일을 반복 _0
하고 _
.
답변4
먼저 다른 도구를 awk
사용하고 실행하는 대신 사용할 수 있습니다 .split
rename
awk 'NR%5000==1{ file=sprintf("table_subset_%d", ((++c)) )} {print >file}' geno_file
이렇게 하면 파일이 앞에 0이 없는 숫자 접미사가 있는 5K 파일 청크로 분할되지만 위의 4비트 길이를 geno_file
자유롭게 사용할 수 있습니다 .0Xd
sprintf("..._%04d", ((++c)) )
geno_file
또는 출력 파일을 9개 부분으로 분할 하려는 경우 먼저 split
해당 옵션을 올바르게 사용하여 1(기본값은 0)부터 시작하는 숫자 접미사를 설정하고 -a N
(길이 N(기본값은 2)의 접미사 생성) 간단히 다음과 같이 사용할 수 있습니다.
split -a 1 --numeric-suffixes=1 -l TOTALLINES/9HERE table_subset_
awk
하지만 여전히 해결책을 잊지 마세요 .