我有一个文件
had my.file
Ha1_00044012__C 1 51035805 10.35639322
Ha1_00045184__C 1 86676829 10.07929888
Ha1_00045056__C 1 150178524 19.44076068
Ha10_00000491__C 10 73473488 10.6038893
Ha10_00000577__C 10 78976728 12.45451149
Ha10_00002949__C 10 113658711 14.94370396
Ha10_00001805__C 10 220068670 10.87452401
我想从第一列中删除最后 3 个字符“__C”。我试过
awk '{gsub(/[__c ]/,"",$1)}3'
但它删除了第一列中的所有“_”。我想要的输出应该是这样的:
head desired
Ha1_00044012 1 51035805 10.35639322
Ha1_00045184 1 86676829 10.07929888
Ha1_00045056 1 150178524 19.44076068
Ha10_00000491 10 73473488 10.6038893
Ha10_00000577 10 78976728 12.45451149
Ha10_00002949 10 113658711 14.94370396
Ha10_00001805 10 220068670 10.87452401
答案1
周围的方括号[__c ]
使其成为放而不是一个顺序的字符。使用gsub
,这将使其匹配(并替换)中的每个_
, c
(小写,注释)和空格字符$1
您似乎想要替换序列的单个实例__C
(大写),您可以使用它来执行sub(/__C/,"",$1)
如果您需要不区分大小写,可以使用/__[Cc]/
答案2
如果文本足够严格,您只是__C
想删除它,您也可以使用以下方法轻松完成此操作sed
:
$ sed 's/__C//' file
Ha1_00044012 1 51035805 10.35639322
Ha1_00045184 1 86676829 10.07929888
Ha1_00045056 1 150178524 19.44076068
Ha10_00000491 10 73473488 10.6038893
Ha10_00000577 10 78976728 12.45451149
Ha10_00002949 10 113658711 14.94370396
Ha10_00001805 10 220068670 10.87452401
可以通过以下方式进行进一步清理sed
:
$ sed 's/__C//;s/^[ ]*//g' a
这将删除从每行开头开始直到H
in 的所有前导空格Ha1
。
答案3
您可以使用以下方式执行此操作:
perl -lane '
substr($F[0], -3) = ""; # remove the last 3 chars from the 1st field
print "@F"; # print the fields, space separated
' my.file
答案4
bash-4.1$ awk -v ncr=3 '{$1=substr($1,0,length($1)-ncr)}1' test.txt
Ha1_00044012 1 51035805 10.35639322
Ha1_00045184 1 86676829 10.07929888
Ha1_00045056 1 150178524 19.44076068
Ha10_00000491 10 73473488 10.6038893
Ha10_00000577 10 78976728 12.45451149
Ha10_00002949 10 113658711 14.94370396
Ha10_00001805 10 220068670 10.87452401
ncr = 它是可变的。您可以在此处指定要从特定列中删除的字符数。