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