将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
从GNUawk
文档
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