如果列以字符开头则删除行尾

如果列以字符开头则删除行尾

我有一个大文件,其中第二列有一些需要截断的行。目前是:

10 10:135524264:C:G 0 135524264 C G
10 rs55726203:135524334:A:G 0 135524334 A G

如果第二列以 ' 开头RS',我需要删除该列冒号后面的所有内容。所以我需要的输出是:

10 10:135524264:C:G 0 135524264 C G
10 rs55726203 0 135524334 A G

我对 unix 比较陌生,只能找到针对我需要的部分内容的论坛问题。我必须sed 's/:.*//'在冒号后删除,但无法弄清楚如何将其专门定位到以“rs”开头的第二列行。

答案1

使用以下方法更容易awk

awk '$2 ~ /^rs/ {sub(/:.*/,"",$2)} 1' file
10 10:135524264:C:G 0 135524264 C G
10 rs55726203 0 135524334 A G

答案2

既然您提到了 sed,那么这是一种方法。一般来说,导航到给定分隔符 S 的第 N 列是这样完成的:“^[^S]*S[^S]*S...”,如果需要记住各个部分,则在各个部分周围加上可选的括号。还有其他方法,但由于 N=2,所以就可以了。

sed -r 's/^([^ ]* )(rs[^ :]*):[^ ]*/\1\2/' file

一旦到达第二列,我只保留以“rs”开头的内容,并以分隔符空格和冒号以外的字符继续。请注意我的 ':[^ ]*' 而不是 ':.*',用于不删除剩余的列。

警告:这仅适用于不包含分隔符的列,就像你的例子一样。如果单元格的引号中包含转义分隔符,例如“文本”“文字文字”text',请考虑使用专用工具,而不是 sed 甚至 awk!

相关内容