按列顺序替换准确的数字

时间:2018-10-29 17:41:26

标签: bash awk sed

我有这个文件,我想替换第3列的编号,以便它们按顺序显示。另外,我需要跳过第一行(文件的标题)。

初始文件:

#results from program A
    8536    17  1   CGTCGCCTAT  116 147M2D
    8536    17  1   CGTCGCTTAT  116 147M2D
    8536    17  1   CGTTGCCTAT  116 147M2D
    8536    17  1   CGTTGCTTAT  116 147M2D
    2005    17  3   CTTG    61  145M
    2005    17  3   TTCG    30  145M
    91823   17  4   ATGAAGC 22  146M
    91823   17  4   GTAGGCC 19  146M
    16523   17  5   GGGGGTCGGT  45  30M1D115M

修改后的文件:

#results from program A
    8536    17  1   CGTCGCCTAT  116 147M2D
    8536    17  1   CGTCGCTTAT  116 147M2D
    8536    17  1   CGTTGCCTAT  116 147M2D
    8536    17  1   CGTTGCTTAT  116 147M2D
    2005    17  2   CTTG    61  145M
    2005    17  2   TTCG    30  145M
    91823   17  3   ATGAAGC 22  146M
    91823   17  3   GTAGGCC 19  146M
    16523   17  4   GGGGGTCGGT  45  30M1D115M

你知道我该怎么做吗?

2 个答案:

答案 0 :(得分:4)

请您尝试以下。

awk 'prev!=$1{++count}{$3=count;prev=$1;$1=$1} 1' OFS="\t"  Input_file

要删除标题,请执行以下操作:

awk 'FNR==1{print;next}prev!=$1{++count}{$3=count;prev=$1;$1=$1} 1' OFS="\t"  Input_file

解决方案2nd: :如果Input_file的1st字段不正确,那么下面的内容可能会对您有所帮助。

awk 'FNR==NR{if(!a[$1]++){b[$1]=++count};next} {$3=b[$1];$1=$1} 1' OFS="\t" Input_file  Input_file

要删除上述第二个解决方案的标题,请使用以下

awk 'FNR==1{if(++val==1){print};next}FNR==NR{if(!a[$1]++){b[$1]=++count};next} {$3=b[$1];$1=$1} 1' OFS="\t" Input_file  Input_file

答案 1 :(得分:2)

另一个极简主义者awk

$ awk '{$3=c+=p!=$1;p=$1}1' file | column -t

8536   17  1  CGTCGCCTAT  116  147M2D
8536   17  1  CGTCGCTTAT  116  147M2D
8536   17  1  CGTTGCCTAT  116  147M2D
8536   17  1  CGTTGCTTAT  116  147M2D
2005   17  2  CTTG        61   145M
2005   17  2  TTCG        30   145M
91823  17  3  ATGAAGC     22   146M
91823  17  3  GTAGGCC     19   146M
16523  17  4  GGGGGTCGGT  45   30M1D115M

带有标头版本

$ awk 'NR==1; NR>1{$3=c+=p!=$1;p=$1; print | "column -t"}' file

#results from program A
8536   17  1  CGTCGCCTAT  116  147M2D
8536   17  1  CGTCGCTTAT  116  147M2D
8536   17  1  CGTTGCCTAT  116  147M2D
8536   17  1  CGTTGCTTAT  116  147M2D
2005   17  2  CTTG        61   145M
2005   17  2  TTCG        30   145M
91823  17  3  ATGAAGC     22   146M
91823  17  3  GTAGGCC     19   146M
16523  17  4  GGGGGTCGGT  45   30M1D115M