我有一个类似
的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列
答案 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