在特定列的连字符后保留部分字符串
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
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
对于输入文件中的第 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
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