열의 확장자 제거

열의 확장자 제거

이런 파일이 있어요

ILMN_1343291    TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG  NM_001402.5
ILMN_1343295    CTTCAACAGCGACACCCACTCCTCCACCTTTGACGCTGGGGCTGGCATTG  NM_002046.3
ILMN_1651209    TCACGGCGTACGCCCTCATGGGGAAAATCTCCCCGGTGACTTTCAGGTCC  NM_182838.1

내 출력 파일이 다음과 같이 보이도록 세 번째 열의 끝에서 숫자 확장자를 제거하고 싶습니다.

ILMN_1343291    TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG  NM_001402
ILMN_1343295    CTTCAACAGCGACACCCACTCCTCCACCTTTGACGCTGGGGCTGGCATTG  NM_002046
ILMN_1651209    TCACGGCGTACGCCCTCATGGGGAAAATCTCCCCGGTGACTTTCAGGTCC  NM_182838

을 사용하여 명령줄에서 어떻게 수행할 수 있습니까 awk? 나는 이것을 할 수 있지만 perl그것을 할 수 있는 단일 명령줄이 있다고 확신합니다.

답변1

awk로:

awk -F'.' '{print $1}' file

-F옵션은 기본 필드 구분 기호(공백)를 점(.)으로 변경합니다.
$1필드 위치의 인덱스입니다(. 필드 구분 기호 사용).

{ILMN_1343291    TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG  NM_001402}.{5}
                  ^^ field index is $1                                          ^^$2

rev 및 awk 사용:

rev file | awk -F'.' '{print $2}'|rev # reverse characters of each lines,\
                                        print field number 2 with (.) separator \
                                        and reverse the result again

유틸리티 rev는 지정된 파일을 표준 출력으로 복사하여 모든 행의 문자 순서를 반대로 바꿉니다. 파일을 지정하지 않으면 표준 입력을 읽습니다.

sed 사용:

sed 's/.[0-9]*$//' file

sed 's/.[^.]*$//' file

$줄의 끝을 가리킵니다. 첫 번째 sed 명령에서 0개 이상의 숫자가 뒤따르는 char(.)를 검색하고 공백으로 바꿉니다.

두 번째 sed 명령에서는 (.) 뒤에 오는 모든 항목을 제거하고 점(.) 자체도 제거합니다.

rev 및 sed 사용:

rev file| sed 's/.*[.]//' |rev

dot(.) 이전의 모든 항목을 삭제합니다. 또한 포함하고 제거합니다. 그 자체.

grep 사용:

grep -oP '.*(?=\.[0-9])' file
    -o, --only-매칭
          일치하는 줄의 일치하는(비어 있지 않은) 부분만 인쇄합니다.
          이러한 각 부분은 별도의 출력 라인에 있습니다.
    -P, --perl-regexp
          PATTERN을 Perl 호환 정규 표현식(PCRE)으로 해석

(?=pattern): 긍정적 예측: 긍정적 예측 구조는 한 쌍의 괄호로 구성되며, 여는 괄호 뒤에 물음표와 등호가 옵니다.

.*(?=\.[0-9]): (긍정적 예측)은 .*패턴( \.[0-9]) 부분을 일치 항목으로 만들지 않고 모든 항목( ) 뒤에 하나의 점(.)과 모든 숫자를 일치시킵니다.

rev 및 grep 사용:

rev file |grep -oP '(?<=[0-9]\.).*' |rev

rev file |grep -oP '[0-9]\.\K.*' |rev

(?<=pattern): 긍정적인 뒤돌아보기. 한 쌍의 괄호. 여는 괄호 뒤에 물음표, "보다 작음" 기호, 등호가 옵니다.

(?<=[0-9]\.).*(긍정적 뒤돌아보기) 뒤에 숫자가 나오고 점(.)으로 끝나는 모든 항목과 일치합니다.

\K두 번째 grep 명령에서는 lookbehind 어설션 대신 nifty를 사용할 수 있습니다 .

컷 포함:

cut -f1 -d. file

cut -c 1-77 file # Print first 77 characters of each line.
cut - 파일의 각 줄에서 섹션을 제거합니다.

-d, --delimiter=삭제
      필드 구분 기호로 TAB 대신 DELIM을 사용하세요.

-f, --fields=LIST
      이 필드만 선택하십시오.

-c, --characters=LIST
      이 문자만 선택하세요

while 루프를 사용하면:

while read line; do echo "${line::-2}";done <file

각 줄 끝에 길이가 1인 숫자만 있고 길이가 고정된 경우에 작동합니다. 위 명령은 입력 파일의 모든 줄 끝에서 마지막 두 문자를 제거합니다. 대체 명령은 입니다 ${line%??}.

답변2

확장자가 모두 숫자라고 가정합니다.

perl -pi -e 's/\.\d+$//' /path/to/file

-i내부 편집을 수행합니다(예: sed). \d숫자를 의미하며 $줄의 끝을 나타냅니다.

와 함께 awk:

awk 'gsub(/\.[0-9]+$/,"")' /path/to/file

gawk최신 버전에는 내부 편집 옵션이 있지만 그것이 얼마나 이식 가능한지는 잘 모르겠습니다. gsub대상 열을 지정하는 선택적 매개변수를 지원합니다.

awk 'gsub(/\.[0-9]+$/,"",$3)' /path/to/file

마지막 형식에는 마치 완료한 것처럼 출력에서 ​​각 열을 단일 공백으로 구분하는 원하지 않는 부작용이 있습니다 print $1,..,$NF. 이유는 모르겠습니다.

답변3

사용은 awk간단합니다. 필드 구분 기호를 다음과 같이 설정하세요 ..

awk -F. '{print $1}' file

셸(이 경우 bash)을 사용하는 또 다른 접근 방식은 다음과 같습니다.

while IFS=.; read -r lines _; do  line+=("$lines"); done <file                                                                           
printf "%s\n" "${line[@]}"
ILMN_1343291    TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG  NM_001402
ILMN_1343295    CTTCAACAGCGACACCCACTCCTCCACCTTTGACGCTGGGGCTGGCATTG  NM_002046
ILMN_1651209    TCACGGCGTACGCCCTCATGGGGAAAATCTCCCCGGTGACTTTCAGGTCC  NM_182838

답변4

이렇게 하면 점으로 시작하는 모든 내용이 제거됩니다.

sed 's/\..*//'

관련 정보