我有一个大约 700 万行的文件,如下所示:
head gokind_SNPs.txt
1:753541:G:A
1:769223:C:G
1:771967:G:A
1:778745:A:G
1:779322:A:G
...
如何删除第二个冒号之后的所有内容,使其看起来像这样:
1:753541
1:769223
1:771967
1:778745
1:779322
...
我尝试这样做,但它不起作用,文件没有改变:
sed 's/:[A-Z].* / /g' gokind_SNPsF.txt > gokind_SNPsf.txt
答案1
使用 awk ,如果你想删除它可能是的任何字符..
awk -F":" '{ print $1":"$2 }' gokind_SNPs.txt > gokind_SNPs_OUTPUT.txt
答案2
您的命令没有执行任何操作,因为您使用的正则表达式试图匹配数据中不存在的空格。
相反,使用
sed 's/:[A-Z].*//' gokind_SNPsF.txt >new-gokind_SNPsf.txt
这将删除每一行中:
紧随其后的大写字母的第一行的所有文本。我还选择不替换任何内容,而不是替换空格,并且删除了g
不必要的标志。
我假设你没有实际上运行您显示的命令,因为这会在开始之前截断(清空)您的数据文件sed
(由于重定向到您正在读取的同一文件)。
sed
如果您想使用use进行就地编辑sed -i
,还可以阅读“如何使用 sed -i (就地编辑)实现可移植性?”。
一个比你的命令更快的替代方法sed
是
cut -d: -f -2 gokind_SNPsF.txt >new-gokind_SNPsf.txt
:
它只是从每行中提取前两个分隔字段。您可以-f -2
使用-f 1,2
或-f 1-2
来指定您想要获取前两列。
使用awk
,你会做
awk -F : 'BEGIN { OFS=FS } { print $1, $2 }' gokind_SNPsF.txt >new-gokind_SNPsf.txt
仅将每行的前两个字段打印到新文件中。
使用 GNU awk
,您可以使用以下命令进行就地编辑
awk -i inplace -F : 'BEGIN { OFS=FS } { print $1, $2 }' gokind_SNPsF.txt
看 ”如何使用 awk 就地更改文件? (与“sed -i”一样)“了解更多相关信息。
答案3
该cut
命令正是为此而设计的:
cut -d: -f-2
答案4
切勿尝试写入您要读取的同一个文件:
sed 's/:[A-Z].* / /' gokind_SNPsF.txt > tmp && mv tmp gokind_SNPsf.txt
sed -i
或者如果您的 sed 版本支持它,则使用它。