0

我正在学习 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

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

提前致谢

4

2 回答 2

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
}
于 2013-04-08T18:41:53.523 回答
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
于 2013-04-08T20:35:45.853 回答