
이런 파일이 있어요
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/\..*//'