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

Keep part of string after hyphen for specific column

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

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

输入:

TCCCATATGGTCTAGCGGTTAGGATTCCT   1-230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    2-172580

输出:

TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    172580

这应该可以帮助您 awk。只需替换第 2 列 - 之前的所有内容,然后打印该行(使用显示的示例编写和测试)。

awk '{sub(/.*-/,"",)} 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(/^[^-]*-/, "", )} 1' file
TCCCATATGGTCTAGCGGTTAGGATTCCT 230823
GCATTGGTGGTTCAGTGGTAGAATTCTC 172580

您可以使用以下 sed 命令:

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

参见online sed demo

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

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

  • ^ - 字符串开头
  • ([^[:space:]]+[[:blank:]]+) - 第 1 组(</code> 指该组值):一个或多个 non-whitespace 个字符后跟一个或多个水平空白字符 </li> <li><code>[0-9]+- - 1 个或多个数字和一个 -.

并且使用 FS 变量,另一个带有 awk 的解决方案可以是:

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

TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    172580
$ sed 's/[0-9]*-//' file
TCCCATATGGTCTAGCGGTTAGGATTCCT   230823

有多个分隔符,即连字符和space,最好使用awk,例如:

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

输出:

TCCCATATGGTCTAGCGGTTAGGATTCCT 230823
GCATTGGTGGTTCAGTGGTAGAATTCTC 172580