将awk与sub结合使用可打印多列

时间:2018-04-09 11:53:29

标签: 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:244953:TTGAC:T 0 244953
2 2:569406:G:A 0 569406

输出文件中的第1列是输入文件中第一列的第一个数字

尝试:

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

但它无法正确打印$2

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

请您试试,请告诉我这是否对您有所帮助?

id      key           value
244574  [16;18;54]    [999;999;174]
218965  [19;21;33;60] [808;662;1;8]
218966  [19;21;33;60] [1103;902;1;8]

答案 1 :(得分:1)

您的想法是正确的,但它没有成功的原因是您已将$1值替换为gsub()例程的一部分且不< / em>备份它。因此,下一次调用$1将在调用后返回值。所以备份如下。对于第一个替换部分,此处sub()也足够了

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

或者使用split()函数到第一列的第一部分。对函数的调用返回由分隔符:拆分的元素数,并将元素更新为数组a。我们根据需要打印元素和后续列。

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

来自String functions

下的GNU awk文档

split(string, array [, fieldsep [, seps ] ])

  

将字符串分成由fieldsep分隔的片段,并将片段存储在数组中,将分隔符字符串存储在seps数组中。第一部分存储在array[1]中,第二部分存储在array[2]中,依此类推。第三个参数fieldsep的字符串值是描述拆分字符串的位置的正则表达式。

添加| column -t以美化结果,使其看起来更加分散且可读

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