【问题标题】:Keep part of string after hyphen for specific column在特定列的连字符后保留部分字符串
【发布时间】:2021-01-01 00:49:39
【问题描述】:

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

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

输入:

TCCCATATGGTCTAGCGGTTAGGATTCCT   1-230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    2-172580

输出:

TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
GCATTGGTGGTTCAGTGGTAGAATTCTC    172580

【问题讨论】:

    标签: unix awk sed cut


    【解决方案1】:

    这应该可以帮助您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
    

    【讨论】:

      【解决方案2】:

      你可以使用这个 awk:

      awk '{sub(/^[^-]*-/, "", $2)} 1' file
      
      TCCCATATGGTCTAGCGGTTAGGATTCCT 230823
      GCATTGGTGGTTCAGTGGTAGAATTCTC 172580
      

      【讨论】:

        【解决方案3】:

        您可以使用以下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 个或多个数字和一个 -

        【讨论】:

          【解决方案4】:

          使用FS 变量,awk 的另一种解决方案可以是:

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

          TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
          GCATTGGTGGTTCAGTGGTAGAATTCTC    172580
          

          【讨论】:

            【解决方案5】:
            $ sed 's/[0-9]*-//' file
            TCCCATATGGTCTAGCGGTTAGGATTCCT   230823
            

            【讨论】:

              【解决方案6】:

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

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

              输出:

              TCCCATATGGTCTAGCGGTTAGGATTCCT 230823
              GCATTGGTGGTTCAGTGGTAGAATTCTC 172580
              

              【讨论】:

                猜你喜欢
                • 2020-03-04
                • 2019-10-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-08-05
                • 1970-01-01
                相关资源
                最近更新 更多