我现在的文本文件看起来像这样,
VOG0005 - k141_44786_1 - 4.9e-11 41.0 0.0 2e-08 32.4 0.0 2.0 2 0 0 2 2 2 2 -
VOG0005 - k141_46357_20 - 9.2e-44 148.8 1.7 2.4e-32 111.2 0.2 3.0 2 1 1 3 3 3 3 -
VOG0010 - k141_1081_2 - 1.2e-06 27.4 0.5 0.00011 21.0 0.0 2.3 2 0 0 2 2 2 2 -
VOG0010 - k141_17432_67 - 1.2e-07 30.7 0.0 1.7e-07 30.2 0.0 1.3 1 1 0 1 1 1 1 -
VOG0010 - k141_2610_7 - 2.1e-06 26.6 0.0 2.9e-06 26.2 0.0 1.1 1 0 0 1 1 1 1
该sort
命令是否将连字符和中间的空格算作单独的列?如果是,那么如何使用该cut
命令删除之间的连字符?
VOG0005 - k141_44786_1 - 4.9e-11
得到这样的东西
VOG0005 k141_44786_1 4.9e-11
即,只有一个空格对我有用。我尝试过一个命令:cut -f2 File.txt
,但它似乎不适用于我的情况。
有人可以帮忙吗?
答案1
您可以使用 sed 命令用 spac 删除连字符。
sed 's/- //g'
请参考下面的例子
# cat example.txt
VOG0005 - k141_44786_1 - 4.9e-11 41.0 0.0 2e-08 32.4 0.0 2.0 2 0 0 2 2 2 2 -
VOG0005 - k141_46357_20 - 9.2e-44 148.8 1.7 2.4e-32 111.2 0.2 3.0 2 1 1 3 3 3 3 -
VOG0010 - k141_1081_2 - 1.2e-06 27.4 0.5 0.00011 21.0 0.0 2.3 2 0 0 2 2 2 2 -
VOG0010 - k141_17432_67 - 1.2e-07 30.7 0.0 1.7e-07 30.2 0.0 1.3 1 1 0 1 1 1 1 -
VOG0010 - k141_2610_7 - 2.1e-06 26.6 0.0 2.9e-06 26.2 0.0 1.1 1 0 0 1 1 1 1 -
# sed 's/- //g' example.txt
VOG0005 k141_44786_1 4.9e-11 41.0 0.0 2e-08 32.4 0.0 2.0 2 0 0 2 2 2 2 -
VOG0005 k141_46357_20 9.2e-44 148.8 1.7 2.4e-32 111.2 0.2 3.0 2 1 1 3 3 3 3 -
VOG0010 k141_1081_2 1.2e-06 27.4 0.5 0.00011 21.0 0.0 2.3 2 0 0 2 2 2 2 -
VOG0010 k141_17432_67 1.2e-07 30.7 0.0 1.7e-07 30.2 0.0 1.3 1 1 0 1 1 1 1 -
VOG0010 k141_2610_7 2.1e-06 26.6 0.0 2.9e-06 26.2 0.0 1.1 1 0 0 1 1 1 1 -
答案2
与 类似sed
,您也可以使用perl
:
$ cat File.txt | tr -s " " | perl -pe 's/[[:space:]]-//g' | sponge File.txt
VOG0005 k141_44786_1 4.9e-11 41.0 0.0 2e-08 32.4 0.0 2.0 2 0 0 2 2 2 2
VOG0005 k141_46357_20 9.2e-44 148.8 1.7 2.4e-32 111.2 0.2 3.0 2 1 1 3 3 3 3
VOG0010 k141_1081_2 1.2e-06 27.4 0.5 0.00011 21.0 0.0 2.3 2 0 0 2 2 2 2
VOG0010 k141_17432_67 1.2e-07 30.7 0.0 1.7e-07 30.2 0.0 1.3 1 1 0 1 1 1 1
VOG0010 k141_2610_7 2.1e-06 26.6 0.0 2.9e-06 26.2 0.0 1.1 1 0 0 1 1 1 1
或者
<File.txt tr -s " " | perl -pe 's/[[:space:]]-//g' | sponge File.txt
# on fish shell
tr -s " " <File.txt | perl -pe 's/[[:space:]]-//g' | sponge File.txt
解释
tr -s " "
# Removes extra spaces
perl -pe 's/[[:space:]]-//g'
# Replaces any ' -' with nothing
sponge File.txt
# Reads standard input and writes it out to the specified file.
显然你可以仅使用perl
(感谢@斯蒂芬·查泽拉斯):
perl -pi -e 's/ +/ /g; s/[[:space:]]-//g' File.txt
相似地sed
:
sed -i -E 's/ +/ /g; s/[[:space:]]-//g' File.txt
请参阅@Stéphane Chazelas 评论以获取解释
答案3
首先,是的,sort
会将第一个-
视为第 2 列,将第k141_xxxx
一个视为第 3 列,第二个-
视为第 4 列,等等。但这是一个不完全的过度简化;事实是微妙而复杂的。
你的问题并不完全清楚。要破坏第二列和第四列,无论它们是什么,请执行以下操作
awk '{ $2=""; $4=""; print }' example.txt
要破坏任何带有连字符的字段,请执行以下操作
awk '{for (i=1; i<=NF; i++) if ($i == "-") $i = ""; print}' example.txt
awk
是矫枉过正(但是,也是如此perl
)。