输入:
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
感谢您的帮助
答案 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
下的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