将awk与sub组合以打印多列

将awk与sub组合以打印多列,awk,Awk,输入: 期望输出: MARKER POS EA NEA BETA SE N EAF STRAND IMPUTED 1:244953:TTGAC:T 244953 T TTGAC -0.265799 0.291438 4972 0.00133176 + 1 2:569406:G:A 569406 A G -0.17456 0.296652 4972 0.00128021 + 1 输出文件中的第1列是输入文件中第一列的第一个数字 尝试: 1 1:244953:TTGAC:T 0

输入:

期望输出:

MARKER  POS EA  NEA BETA    SE  N   EAF STRAND  IMPUTED
1:244953:TTGAC:T 244953 T TTGAC -0.265799 0.291438 4972 0.00133176 + 1
2:569406:G:A 569406 A G -0.17456 0.296652 4972 0.00128021 + 1
输出文件中的第1列是输入文件中第一列的第一个数字

尝试:

1 1:244953:TTGAC:T 0 244953
2 2:569406:G:A 0 569406
但它不能正确打印
$2


谢谢您的帮助

请尝试以下内容,并让我知道这是否对您有帮助

awk '{gsub(/:.*/,"",$1);print $1,0,$2}' input

您的想法是正确的,但它不起作用的原因是您已将
$1
值替换为
gsub()
例程的一部分,并且没有对其进行备份。因此下次调用
$1
将在调用后返回值。因此,请按如下所示进行备份。此外,这里的
sub()
对于第一个更换零件也足够了

awk -v s1=" " -F"[: ]" 'FNR>1{print $1 s1 $1 OFS $2 OFS $3 OFS $4 s1 "0" s1 $5}' OFS=":"   Input_file
或者对第一列的第一部分使用
split()
函数。对函数的调用返回按分隔符拆分的元素数
,并将元素更新到数组
a
。我们根据需要打印元素和后续列

awk 'NR>1{backup=$1; sub(/:.*/,"",backup);print backup,$1,0,$2}' file
从GNU
awk
文档

split(字符串、数组[、字段sep[、seps]])
将字符串分成由
fieldsep
分隔的片段,并将片段存储在数组中,将分隔符字符串存储在
seps
数组中。第一个片段存储在
数组[1]
中,第二个片段存储在
数组[2]
中,依此类推。第三个参数的字符串值,
fieldsep
,是一个描述拆分字符串位置的regexp

添加一个
|列-t
,以美化结果,使其看起来更加间隔和可读

awk 'NR>1{n=split($1, a, ":"); print a[1],$1,"0", $2}' file

谢谢你,成功了!请您添加一些关于split命令的解释,谢谢!
awk 'NR>1{n=split($1, a, ":"); print a[1],$1,"0", $2}' file | column -t