디렉토리의 모든 파일에서 특정 접미사 제거

디렉토리의 모든 파일에서 특정 접미사 제거

다음을 사용하여 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개 문자가 로 대체됩니다 _.

위의 내용은 renamePerl과 함께 제공되는 유틸리티(때때로 호출됨)와 함께 작동합니다. 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사용하고 실행하는 대신 사용할 수 있습니다 .splitrename

awk 'NR%5000==1{ file=sprintf("table_subset_%d", ((++c)) )} {print >file}' geno_file

이렇게 하면 파일이 앞에 0이 없는 숫자 접미사가 있는 5K 파일 청크로 분할되지만 위의 4비트 길이를 geno_file자유롭게 사용할 수 있습니다 .0Xdsprintf("..._%04d", ((++c)) )

geno_file또는 출력 파일을 9개 부분으로 분할 하려는 경우 먼저 split해당 옵션을 올바르게 사용하여 1(기본값은 0)부터 시작하는 숫자 접미사를 설정하고 -a N(길이 N(기본값은 2)의 접미사 생성) 간단히 다음과 같이 사용할 수 있습니다.

split -a 1 --numeric-suffixes=1 -l TOTALLINES/9HERE table_subset_

awk하지만 여전히 해결책을 잊지 마세요 .

관련 정보