如何删除第二个冒号之后列中的所有内容

如何删除第二个冒号之后列中的所有内容

我有一个大约 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 版本支持它,则使用它。

相关内容