아래와 같은 테이블이 있습니다.
"baseMean" "log2FoldChange" "lfcSE" "stat" "pvalue" "padj"
"ENSG00000000003.14" 11.3434183210348 0.753849141787545 0.682104979689654 1.10518052826785 0.269081372382168 0.999928163137131
"ENSG00000000419.12" 793.733816508413 -0.256066185652526 0.133681398896401 -1.91549600592503 0.0554292780227467 0.863889514659372
"ENSG00000000457.13" 948.240987147508 -0.088027064401221 0.0869481579436567 -1.01240861776811 0.3113427195966
.X
첫 번째 열의 따옴표와 패턴을 제거하고 싶습니다. 내 말은 이것이다:
"baseMean" "log2FoldChange" "lfcSE" "stat" "pvalue" "padj"
ENSG00000000003 11.3434183210348 0.753849141787545 0.682104979689654 1.10518052826785 0.269081372382168 0.999928163137131
ENSG00000000419 793.733816508413 -0.256066185652526 0.133681398896401 -1.91549600592503 0.0554292780227467 0.863889514659372
ENSG00000000457 948.240987147508 -0.088027064401221 0.0869481579436567 -1.01240861776811 0.3113427195966
이런 경우 sed나 다른 수단을 사용하여 어떻게 명령줄을 작성할 수 있나요?
답변1
사용 sed
:
$ echo \"ENSG00000009694.13\" 3.25851232080741 0.670268379884225 | sed -E "s|\"(.+?)\.[0-9]*\"|\1|g"
ENSG00000009694 3.25851232080741 0.670268379884225
나는 당신이 다루고 있는 것이 거대한 로그 파일이라고 생각합니다. 이 경우 다음을 사용할 수 있습니다.
$ sed -E "s|\"(.+?)\.[0-9]*\"|\1|g" your_file.txt
"baseMean" "log2FoldChange" "lfcSE" "stat" "pvalue" "padj"
ENSG00000000003 11.3434183210348 0.753849141787545 0.682104979689654 1.10518052826785 0.269081372382168 0.999928163137131
sed
결과를 인쇄 합니다 . "내부 모드"를 나타내기 위해 -i
앞에 -E
; 를 추가 할 수도 있으므로 sed가 파일을 직접 수정합니다.-i
설명하다:
저는 sed의 "찾기 및 바꾸기" 기능을 사용하고 있습니다. 기본 구문은 다음과 같습니다.
sed -E "s|p1|p2|g"
그런 다음 sed는 "확장 정규 표현식 패턴"을 의미하는 .을 대체하므로 복잡한 p1
정규 표현식 이 될 수 있습니다.p2
-E
p1
여기 내 꺼야 p1
( (
지금은 생략 )
)
\".+?\.[0-9]*\"
~에
\"
따옴표 일치,\.[0-9]*
Maces 패턴은 점으로 시작하고 그 뒤에 0부터 무한대까지의 숫자가 옵니다..+?
그 사이에 어떤 패턴으로든 작업하세요.
then은 p2
단순히 \1
쌍의 첫 번째 문자열을 나타내는 a입니다. 완성된!(
)
p1
답변2
awk 'NR>1{gsub(/\"/,"",$0);gsub(/\.[0-9]*/,"",$1)}1' filename
산출
"baseMean" "log2FoldChange" "lfcSE" "stat" "pvalue" "padj"
ENSG00000000003 11.3434183210348 0.753849141787545 0.682104979689654 1.10518052826785 0.269081372382168 0.999928163137131
ENSG00000000419 793.733816508413 -0.256066185652526 0.133681398896401 -1.91549600592503 0.0554292780227467 0.863889514659372
ENSG00000000457 948.240987147508 -0.088027064401221 0.0869481579436567 -1.01240861776811 0.3113427195966
답변3
$ sed 's/^"\(ENS[[:alnum:]]*\)\..*"/"\1"/' file
"baseMean" "log2FoldChange" "lfcSE" "stat" "pvalue" "padj"
"ENSG00000000003" 11.3434183210348 0.753849141787545 0.682104979689654 1.10518052826785 0.269081372382168 0.999928163137131
"ENSG00000000419" 793.733816508413 -0.256066185652526 0.133681398896401 -1.91549600592503 0.0554292780227467 0.863889514659372
"ENSG00000000457" 948.240987147508 -0.088027064401221 0.0869481579436567 -1.01240861776811 0.3113427195966
위 명령은 sed
첫 번째 열의 Ensembl stable ID에서만 버전을 제거합니다. "ENS
줄의 시작 부분을 일치시키고 그 뒤에 임의의 수의 영숫자 문자, 점 및 따옴표가 아닌 문자를 일치시켜 이를 수행합니다 . 점과 따옴표가 아닌 문자를 삭제하려면 대체를 사용하세요.
큰따옴표도 제거하려면 대체 텍스트를 에서 로 변경 "\1"
하세요 \1
.
안정적인 ID에 항상 버전이 첨부되어 있다고 확신하는 경우 점과 큰따옴표 사이의 첫 번째 하위 문자열만 제거하는 다음 표현식으로 단축할 수 있습니다.
$ sed 's/\..*"/"/' file
"baseMean" "log2FoldChange" "lfcSE" "stat" "pvalue" "padj"
"ENSG00000000003" 11.3434183210348 0.753849141787545 0.682104979689654 1.10518052826785 0.269081372382168 0.999928163137131
"ENSG00000000419" 793.733816508413 -0.256066185652526 0.133681398896401 -1.91549600592503 0.0554292780227467 0.863889514659372
"ENSG00000000457" 948.240987147508 -0.088027064401221 0.0869481579436567 -1.01240861776811 0.3113427195966
따옴표를 제거해야 합니까? 2,$ s/"//g
예를 들어 표현식을 사용하여 제거할 수 있습니다.
sed -e 's/\..*"/"/' -e '2,$ s/"//g' file
또는 모든 것을 직접 전달하여 tr -d '"'
모든 따옴표를 제거할 수 있습니다.
sed 's/\..*"/"/' file | tr -d '"'