파일 이름의 일부 추출

파일 이름의 일부 추출

TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET내 Linux 시스템에 파일 이름이 있고 그 파일 이름을 추출하기만 하면 됩니다 TRNPRD.STD.BSRE.

다음 명령을 시도했습니다.

echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | awk -F'.' '{for(i=0;++i<=NF-5;) printf $i".";}'

그러나 원하는 결과를 반환하고 끝에 필요하지 않은 추가 점이 있습니다.

TRNPRD.STD.BSRE.

내가 여기서 무엇을 놓치고 있는지 말해 줄 수 있는 사람이 있나요?

답변1

이 작업에는 약간 과잉이므로 cut여기에서 사용하는 것이 좋습니다 .awk

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | cut -d . -f -3
TRNPRD.STD.BSRE

답변2

인쇄 한 다음 추가 하라고 지시했기 때문에 명령 awk이 추가됩니다 . 따라서 extra 로 시작합니다 ..$i..

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    awk -F'.' '{for(i=0;++i<=NF-6;) printf $i"."; print $(NF-5)}'
TRNPRD.STD.BSRE

또는 처음 3개를 직접 인쇄합니다.

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    grep -oP '^([^.]+\.){2}[^.]+'
TRNPRD.STD.BSRE

물론 원래 방법을 사용하여 중복 항목을 삭제할 수도 있습니다 ..

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    awk -F'.' '{for(i=0;++i<=NF- 5;) printf $i".";}' | sed 's/\.$//'
TRNPRD.STD.BSRE$ 

그러나 가장 좋고 간단한 해결책은cut @Panki가 제안한대로.

답변3

문자열에서 점으로 구분된 마지막 5개의 하위 문자열을 제거하려면 다음을 수행하십시오.

$ name=TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
$ echo "${name%.*.*.*.*.*}"
TRNPRD.STD.BSRE

이것이 적용됩니다표준 매개변수 확장값의 끝에서 지정된 패턴과 일치하는 하위 문자열을 제거합니다 $name.


네가 원한다면유지하다문자열에서 점으로 구분된 처음 세 개의 하위 문자열:

$ name=TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
$ echo "${name%.${name#*.*.*.}}"
TRNPRD.STD.BSRE

$name먼저 사용 ${name#*.*.*.}( #왼쪽에서 제거/시작, %오른쪽에서 제거/끝)에서 처음 세 자리 숫자를 제거한 다음 결과를 사용하여 문자열의 꼬리를 제거하고 처음 세 개의 점으로 구분된 비트를 남겨 둡니다.


$name다음 제안은 in 의 값 에 개행 문자가 포함되어 있지 않은 한 작동합니다(표준 텍스트 처리 도구를 사용하는 모든 솔루션에서 문제가 됨).

코드 awk에서는 항상 각 필드 끝에 점을 인쇄합니다. 약간 더 강력하게 만들려면 다음과 같은 것을 사용할 수 있습니다.

awk -v OFS="." '{ n=split($0,a,"\."); $0=""; for (i=1; i<=3 && i<=n; ++i) $i=a[i]; print }' <<<"$name"

값을 포인트로 분할한 다음 값의 처음 세 부분에 대한 출력 레코드를 생성하고 인쇄합니다(출력 필드 구분 기호, OFS포인트로 설정).

처음 3개 비트를 유지하는 대신 마지막 5개 비트를 삭제하려면 다음을 수행하세요.

awk -v OFS="." '{ n=split($0,a,"\."); $0=""; for (i=1; i<=n-5; ++i) $i=a[i]; print }' <<<"$name"

관련 정보