如何合并,联接,连接文本文件中由下划线分隔的前两列?

时间:2019-01-21 18:25:26

标签: bash awk sed

我有一个文本:SG_gen.txt文件,其中包含多列,如下所示:

  snp_CHR      POS HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 HG00103
   snp_3 47609552       0       1       1       1       1       0       1
   snp_3 47614413       0       1       1       1       1       0       1
   snp_3 47616151       0       1       1       1       1       0       1
   snp_3 47616155       0       1       1       1       1       0       1
   snp_3 47617504       0       1       1       1       1       0       1
   snp_3 47617679       0       1       1       1       1       0       1
...

我想通过“ _”加入前两列:snp_CHR和POS,并将其重命名为ID,以便该列看起来像这样:

ID
snp_3_47609552
snp_3_47614413
snp_3_47616151
...

这个新的ID列将是第一列,我将保留所有其他列HG00096,HG00097 ...我将不保留原始的snp_CHR和POS。我该怎么办?

我尝试使用:

awk '{print $0, $1 "_" $NF}' SG_gen.txt > SG_gen1.txt 

但这并没有给我我想要的结果。

3 个答案:

答案 0 :(得分:0)

这应该做:

double t; /* Input from user */

int  check;
check = 0;

/* This loop is use to validate the user input.                 *
 * For example: If the user insert a character value "x".       *
 * i am trying to ask the user to insert a valid numeric value. */

while (check == 0)
{
    printf("Insert the value: ");
    if (scanf(" %lf", &t) == 1) {
        check = 1;          /* Everythink okay. No loop needed */
    }
    else
    {
        printf("Failed to read double. ");
        check = 0;          /* loop aganin to read the value */
        fflush( stdout );
    }
}

return 0;

会有多余的空白,以后可以根据需要将其标准化。

答案 1 :(得分:0)

如果认为您的Input_file与所示示例相同,请尝试执行以下操作。

awk 'match($0,/snp_[0-9]+ [0-9]+/){value=substr($0,RSTART,RLENGTH);sub(" ","_",value);print value}'  Input_file

答案 2 :(得分:0)

如果您想尝试Perl。请注意,这将保留示例输入中其他列之间的空间。

$ cat anika.txt
 snp_CHR      POS HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 HG00103
   snp_3 47609552       0       1       1       1       1       0       1
   snp_3 47614413       0       1       1       1       1       0       1
   snp_3 47616151       0       1       1       1       1       0       1
   snp_3 47616155       0       1       1       1       1       0       1
   snp_3 47617504       0       1       1       1       1       0       1
   snp_3 47617679       0       1       1       1       1       0       1

$ perl -pe 's/^\s*//g;  s/\s/_/; s/^\S+\s+\S+/ID/ if $.==1' anika.txt
ID HG00096 HG00097 HG00099 HG00100 HG00101 HG00102 HG00103
snp_3_47609552       0       1       1       1       1       0       1
snp_3_47614413       0       1       1       1       1       0       1
snp_3_47616151       0       1       1       1       1       0       1
snp_3_47616155       0       1       1       1       1       0       1
snp_3_47617504       0       1       1       1       1       0       1
snp_3_47617679       0       1       1       1       1       0       1

$