열에서 확장명 제거

열에서 확장명 제거

이런 파일이 있어요

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 명령에서 char(.) 뒤에 0개 이상의 숫자가 나오는 것을 검색하여 공백으로 바꿉니다.

두 번째 sed 명령에서는 (.) 뒤의 모든 내용을 삭제하고 점(.) 자체도 삭제합니다.

rev 및 sed를 사용하십시오.

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

점(.) 앞에 있는 모든 항목을 포함하고 삭제합니다.

grep을 사용하세요:

grep -oP '.*(?=\.[0-9])' file
    -o, --match만 해당
          일치하는 줄의 일치하는(비어 있지 않은) 부분만 인쇄합니다.
          이러한 각 섹션은 별도의 출력 라인에 있습니다.
    -P, --perl-정규 표현식
          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=목록
      다음 필드만 선택하십시오.

-c, --char=목록
      이 문자만 선택하세요

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/\..*//'

관련 정보