awk命令分割第n个字段

时间:2013-04-08 18:35:53

标签: awk gawk

我正在学习AWK并正在尝试内置字符串函数的练习。

这是我的练习:

我的文件包含如下

RecordType:83    
1,2,3,a|x|y|z,4,5

我想要的输出如下:

RecordType:83       
1,2,3,a,4,5         
1,0,0,x,4,5         
1,0,0,y,4,5       
1,0,0,z,4,5

我为上面的输出写了一个awk命令。

awk -F',' '$1 ~ /RecordType:83/{print $0}

$1 == 1{

split($4,splt,"|")

for(i in splt)

{ 

if(i==1) 

print $1,$2,$3,splt[i],$5,$6 

else 

print $1,0,0,splt[i],$5,$6

} 

}' OFS=, file_name

上面的命令看起来很笨拙。有没有办法最小化命令?

提前致谢

2 个答案:

答案 0 :(得分:3)

我可以管理的最短单线:

awk -F, 'NR>1{n=split($4,a,"|");for(;i++<n;){$4=a[i];print;$2=$3=0}}NR==1' OFS=, file
RecordType:83    
1,2,3,a,4,5
1,0,0,x,4,5
1,0,0,y,4,5
1,0,0,z,4,5

更易阅读的脚本(推荐)

BEGIN {
    FS=OFS=","                                       # Comma delimiter 
}
NR==1 {                                              # If the first line in file
    print $0                                         # Print the whole line
    next                                             # Skip to next line
}
{
    n=split($4,a,"|")                                # Split field four on |
    for(i=1;i<=n;i++)                                # For each sub-field
        print $1,i==1?$2OFS$3:"0"OFS"0",a[i],$5,$6   # Print the output
}

答案 1 :(得分:1)

另一个较短的单行

 awk -F, -v OFS="," 'NR>1{n=split($4,a,"|");while(++i<=n){$4=a[i];print;$2=$3=0}}NR==1' file

以你的例子:

kent$  awk -F, -v OFS="," 'NR>1{n=split($4,a,"|");while(++i<=n){$4=a[i];print;$2=$3=0}}NR==1' file                                                                          
RecordType:83    
1,2,3,a,4,5
1,0,0,x,4,5
1,0,0,y,4,5
1,0,0,z,4,5