如何删除特定列的最后 n 个字符

如何删除特定列的最后 n 个字符

我有一个文件

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

这将删除从每行开头开始直到Hin 的所有前导空格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 = 它是可变的。您可以在此处指定要从特定列中删除的字符数。

相关内容