我有一个像下面这样的表;
"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 将替换p1
为p2
.-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 '"'