问题描述
对于输入文件中的第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