使用awk拆分多个列
我需要拆分一个包含多个列的文件,如下所示:使用awk拆分多个列,awk,Awk,我需要拆分一个包含多个列的文件,如下所示: TCONS_00000001 q1:Ovary1.13|Ovary1.13.1|100|32.599877 q2:Ovary2.16|Ovary2.16.1|100|88.36 TCONS_00000002 q1:Ovary1.19|Ovary1.19.1|100|12.876644 q2:Ovary2.15|Ovary2.15.1|100|365.44 TCONS_00000003 q1:Ova
TCONS_00000001 q1:Ovary1.13|Ovary1.13.1|100|32.599877 q2:Ovary2.16|Ovary2.16.1|100|88.36
TCONS_00000002 q1:Ovary1.19|Ovary1.19.1|100|12.876644 q2:Ovary2.15|Ovary2.15.1|100|365.44
TCONS_00000003 q1:Ovary1.19|Ovary1.19.2|0|0.000000 q2:Ovary2.19|Ovary2.19.1|100|64.567
所需产出:
TCONS_00000001 Ovary1.13.1 32.599877 Ovary2.16.1 88.36
TCONS_00000002 Ovary1.19.1 12.876644 Ovary2.15.1 365.44
TCONS_00000003 Ovary1.19.2 0.000000 Ovary2.19.1 64.567
我的尝试:
awk 'BEGIN {OFS=FS="\t"}{split($2,two,"|");split($3,thr,"|");print $1,two[2],two[4],thr[2],thr[4]}' in.file
问题:
我有更多的列要拆分,如2和3,我希望找到比逐个拆分每个列更短的解决方案。$#借用@Inian的答案的简单性;)
$ # borrowing simplicity from @Inian's answer ;)
$ awk 'BEGIN{FS=OFS="\t"}
{for(i=2; i<=NF; i++){split($i,a,/[:|]/); $i=a[3] "\t" a[5]}} 1' ip.txt
TCONS_00000001 Ovary1.13.1 32.599877 Ovary2.16.1 88.36
TCONS_00000002 Ovary1.19.1 12.876644 Ovary2.15.1 365.44
TCONS_00000003 Ovary1.19.2 0.000000 Ovary2.19.1 64.567
$ # previous solution which leaves tab character at end
$ awk -F'\t' '{printf "%s\t",$1;
for(i=2; i<=NF; i++){split($i,a,/[:|]/); printf "%s\t%s\t",a[3],a[5]};
print ""}' ip.txt
TCONS_00000001 Ovary1.13.1 32.599877 Ovary2.16.1 88.36
TCONS_00000002 Ovary1.19.1 12.876644 Ovary2.15.1 365.44
TCONS_00000003 Ovary1.19.2 0.000000 Ovary2.19.1 64.567
$awk'开始{FS=OFS=“\t”}
{for(i=2;i$#借用@Inian的答案的简单性;)
$awk'开始{FS=OFS=“\t”}
{for(i=2;iWhile很好,如果您计划对一组记录执行冗余操作,建议使用函数并在每个记录上运行它
我将编写一个awk
脚本,如下所示
#!/usr/bin/env awk
function split_args(record) {
n=split(record,split_array,"[:|]")
return (split_array[3]"\t"split_array[n])
}
BEGIN { FS=OFS="\t" }
{
for (i=2;i<=NF;i++) {
$i=split_args($i)
}
print
}
一个丑陋的命令行版本是
awk 'function split_args(record) {
n=split(record,split_array,"[:|]")
return (split_array[3]"\t"split_array[n])
}
BEGIN { FS=OFS="\t" }
{
for (i=2;i<=NF;i++) {
$i=split_args($i)
}
print
}
' newfile
awk'函数拆分参数(记录){
n=split(记录,split_数组,“[:|]”)
返回(拆分数组[3]“\t”拆分数组[n])
}
开始{FS=OFS=“\t”}
{
对于(i=2;iWhile很好,如果您计划对一组记录执行冗余操作,建议使用函数并在每个记录上运行它
我将编写一个awk
脚本,如下所示
#!/usr/bin/env awk
function split_args(record) {
n=split(record,split_array,"[:|]")
return (split_array[3]"\t"split_array[n])
}
BEGIN { FS=OFS="\t" }
{
for (i=2;i<=NF;i++) {
$i=split_args($i)
}
print
}
一个丑陋的命令行版本是
awk 'function split_args(record) {
n=split(record,split_array,"[:|]")
return (split_array[3]"\t"split_array[n])
}
BEGIN { FS=OFS="\t" }
{
for (i=2;i<=NF;i++) {
$i=split_args($i)
}
print
}
' newfile
awk'函数拆分参数(记录){
n=split(记录,split_数组,“[:|]”)
返回(拆分数组[3]“\t”拆分数组[n])
}
开始{FS=OFS=“\t”}
{
对于(i=2;我想cat-in.file | tr'''.\t'.\t'.\awk
…帮助你的案例?我想cat-in.file | tr'.\t'.\t'.\awk
…帮助你的案例?@Sundeep:我真的希望你坚持这一点,而不是在perl
中添加一个不可理解的答案)给你:perl-F'-F'-lane'print-join'.\t',$F[0],map(split/[:]“
:)第一次这样做:D@Sundeep:这个很简单,但我永远不会学习这个构造map
和其他构造,它们似乎永远不会结束是的,除非你喜欢修补这些东西……但后来我在python中学习了列表理解/map/lambda,然后在perl中了解了map/grep/etc;)现在学习一下ruby,它也有map.@Sundeep:我真的希望你坚持这一点,而不是在perl
;)中添加一个不可理解的答案。现在开始:perl-F'\t'-lane'print join“\t”,$F[0],map{(split/[:|]/[2,-1]}@F[1..$\F]“
:)第一次这样做:D@Sundeep:这个很简单,但我永远不会学习这个结构map
和其他结构,它们似乎永远不会结束是的,除非你喜欢修补这些东西…但后来我在python中学习了列表理解/map/lambda,然后在perl中了解了map/grep/etc;)没有我们学习了一点ruby,它也有map。。