다음과 같은 데이터가 있습니다.
chr1 134901 139379 - "ENSG00000237683.5";
chr1 860260 879955 + "ENSG00000187634.6";
chr1 861264 866445 - "ENSG00000268179.1";
chr1 879584 894689 - "ENSG00000188976.6";
chr1 895967 901095 + "ENSG00000187961.9";
GTF 파일을 구문 분석하여 생성했습니다.
가능하다면 awk 또는 sed를 사용하여 5열의 합계를 제거하고 싶습니다 "
. ;
결과는 다음과 같습니다.
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
답변1
사용gsub
:
awk '{gsub(/\"|\;/,"")}1' file
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
달리고 싶다면오직다섯 번째 필드에서는 다른 필드에 따옴표나 세미콜론을 유지합니다.
awk '{gsub(/\"|\;/,"",$5)}1' file
답변2
데이터가 표시된 대로 정확하게 형식화된 경우(즉, 다른 항목 "
이나 ;
다른 열을 보존할 필요가 없는 경우) 다음 tr
을 사용하여 해당 문자를 간단히 제거할 수 있습니다.
tr -d '";' < input.txt > output.txt
답변3
sed를 사용하여 '";'의 모든 인스턴스를 제거합니다.
sed -i 's/[";]//g' file
다섯 번째 열에서 sed를 제거하는 것만으로는 최선의 선택이 아닐 수 있습니다.
답변4
sed 솔루션, 다섯 번째 열만 다루도록 합니다.
sed -E 's/^(([^ ]+ +){4})"([^"]+)";$/\1\3/' infile
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
이는 ERE( -E
또는 -r
일부 이전 sed) 없이 작동하지만 더 많은 백슬래시가 필요합니다. POSIX 사양 1+
에 따르면 -정량자는 ERE 전용이며 BRE 로 대체 (또는 사용)될 수 있습니다.{1,}
\{1,\}
열이 공백으로 구분되지 않은 경우 공백을 POSIX 문자 클래스로 대체하여 [:blank:]
탭 문자와도 일치시킬 수 있습니다.
정규식 세부정보:
^ # Anchored at start of line
( # Capture group 1 for first 4 columns
( # Capture group 2 for repeat count
[^ ]+ # 1 or more non-spaces
+ # 1 or more spaces
){4} # 4 times "word plus spaces" (columns)
) # End capture group 1
" # Column 5 starts with double quote (not captured)
( # Capture group 3 for column 5
[^"]+ # One or more non-quote characters
) # End capture group 3
"; # Quote and semicolon at end of column 5
$ # Anchored at end of line
1 GNU sed는 \+
BRE에서도 확장으로 허용됩니다.