在特定列的连字符后保留字符串的一部分

问题描述

对于输入文件中的第2列,我想保留连字符后的部分。我已经尝试过cut命令,但是不知道如何仅将其应用于第二列:

echo TCCCATATGGTCTAGCGGTTAGGATTCCT   1-230823 | cut -d - -f 2
230823

输入:

TCCCATATGGTCTAGCGGTTAGGATTCCT   1-230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    2-172580

出局:

TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    172580

解决方法

这对awk有帮助。只需将所有内容替换为第二列中的-,然后打印行(用所示示例编写并测试)。

awk '{sub(/.*-/,"",$2)} 1' Input_file

第二种解决方案: 如果您想在awk变量中提及字段号,请尝试:

awk -v field="2" '{sub(/.*-/,$field)} 1' Input_file

通用解决方案(可处理多个字段值): 如果OP需要在可定义为awk变量的多个字段中执行替换,则请尝试遵循。

awk -v field="2,3" '
BEGIN{
  num=split(field,array,",")
  for(i=1;i<=num;i++){ fields[array[i]] }
}
{
  for(i=1;i<=NF;i++){
    if(i in fields){ sub(/.*-/,$i) }
  }
}
1' Input_file
,

您可以使用以下awk:

awk '{sub(/^[^-]*-/,$2)} 1' file
TCCCATATGGTCTAGCGGTTAGGATTCCT 230823
GCATTGGTGGTTCAGTGGTAGAATTCTC 172580
,

您可以使用以下sed命令:

sed -E 's/^([^[:space:]]+[[:blank:]]+)[0-9]+-/\1/' file

请参见online sed demo

s='TCCCATATGGTCTAGCGGTTAGGATTCCT   1-230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    2-172580'
sed -E 's/^([^[:space:]]+[[:blank:]]+)[0-9]+-/\1/' <<< "$s"
# TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
# GCATTGGTGGTTCAGTGGTAGAATTCTC    172580

POSIX ERE(-E选项启用此语法)正则表达式匹配

  • ^-字符串的开头
  • ([^[:space:]]+[[:blank:]]+)-第1组(\1指的是该组值):一个或多个非空白字符,后跟一个或多个水平空白字符
  • [0-9]+--1个或多个数字和一个-
,
$ sed 's/[0-9]*-//' file
TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
,

使用FS变量,使用awk的另一种解决方案可以是:

awk -v FS='[0-9]+-' '{print $1 $2}' input

TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    172580
,

使用多个定界符(即连字符和空格),最好使用awk,例如:

<infile awk '{ print $1,$3 }' FS='[- ]+'

输出:

TCCCATATGGTCTAGCGGTTAGGATTCCT 230823
GCATTGGTGGTTCAGTGGTAGAATTCTC 172580

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...