如何使用与Unix环境中第四列的字符串关联的第三列数填充列?

时间:2017-09-25 09:14:13

标签: bash unix awk

我有一个类似

的TAB文件
342455  94387   94387   YY1AP1 
                        YY1AP1 
        141675  141675  LAMTOR2
141675  141675  141675  LAMTOR2
                        NRDC    
        352178  352178  NRDC   
                        NRDC       
        352178  352178  NRDC    
        352178  352178  NRDC    
                        NRDC      
                311380  MPC2
                311380  MPC2
                        MPC2

我想根据第四列填写每一行的第一列,第三列的数字。此外,那些行是空的,也应该用与第四列相对应的相同数字填充。因此,所需的输出应为:

342455  94387   94387   YY1AP1 
342455                  YY1AP1 
141675  141675  141675  LAMTOR2
141675  141675  141675  LAMTOR2
352178                  NRDC    
352178  352178  352178  NRDC   
352178                  NRDC       
352178  352178  352178  NRDC    
352178  352178  352178  NRDC    
352178                  NRDC      
311380          311380  MPC2
311380          311380  MPC2
311380                  MPC2

通过这种方式,我试图这样做:

awk 'BEGIN { FS=OFS="\t" } {if ($1 == "") { $1 = $3 } else if ($1 ~/^[0-9]/){ $1 = $1 }} print}' "input.tsv" > "output.tsv";

然而,如果第三列中有数字,则只填充第一列。我想创建一个哈希,以便关联第三和第四列,然后将它关联到第一列并获得所需的输出但是,有没有可能以更简单的方式做到这一点?提前谢谢。

确定。通过脚本@ RavinderSingh13获得的输出类似于:

342455  94387   94387   YY1AP1
YY1AP1                  YY1AP1
141675  141675  141675  LAMTOR2
141675  141675  141675  LAMTOR2
NRDC                    NRDC
352178  352178  352178  NRDC
NRDC                    NRDC
352178  352178  352178  NRDC
352178  352178  352178  NRDC
NRDC                    NRDC
311380          311380  MPC2
311380          311380  MPC2
MCP2                    MPC2

执行我想要的相同功能,但在第1列而不是第3列打印第4列

2 个答案:

答案 0 :(得分:1)

++有一个好问题,你可以试着跟我来,让我知道这是否对你有帮助,如果你不打扰间距(否则我也可以解决它)。

awk '
FNR==NR{
  val=$0;
  if(!/^ +[a-zA-Z]+/){
    sub(/^ +/,"",val);
    num=split(val, a," ");
    b[$NF]=a[1]
};
  if(/^[0-9]+/){
    b[$NF]=$1
};
  next
}
/^[0-9]+/{
  print;
  next
}
!/^[0-9]+/{
  print b[$NF],$0
}
'   Input_file  Input_file

输出如下。

342455  94387   94387   YY1AP1
342455                         YY1AP1
141675         141675  141675  LAMTOR2
141675  141675  141675  LAMTOR2
352178                         NRDC
352178         352178  352178  NRDC
352178                         NRDC
352178         352178  352178  NRDC
352178         352178  352178  NRDC
352178                         NRDC
311380                 311380  MPC2
311380                 311380  MPC2
311380                         MPC2

答案 1 :(得分:1)

试试这个:

awk -F'\t' '
FNR == NR {
    if(!arr[$4])
        arr[$4] = ($1) ? $1 : $3;
}
FNR != NR {
    if(!$1)
        printf "%d", arr[$4];
    print;
}' input.txt input.txt