如何使用 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;-i代表“就地模式”,因此 sed 将直接修改您的文件。

解释:

我正在使用 sed 的“查找和替换”功能。基本语法是

sed -E "s|p1|p2|g"

然后 sed 将替换p1p2.-E代表“扩展正则表达式模式”,因此p1可以是一些复杂的正则表达式。

我的p1这里是((暂时省略)

\".+?\.[0-9]*\"

其中

  • \"匹配引号,
  • \.[0-9]*maches 模式以点开头,并且后面有 0 到无穷大的数字
  • .+?在中间加工任何图案。

thenp2就是一个简单的 a ,表示 中的第一个和对\1之间的字符串。完成了!()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 稳定 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 '"'

相关内容