sed 명령줄을 사용하여 열에서 패턴을 제거하는 방법은 무엇입니까?

sed 명령줄을 사용하여 열에서 패턴을 제거하는 방법은 무엇입니까?

아래와 같은 테이블이 있습니다.

"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-Ep1

여기 내 꺼야 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 '"'

관련 정보