2013-04-08 72 views
0

我正在学习AWK,并试图对内置字符串函数进行一些练习。awk命令拆分第n个字段

这里是我的锻炼:

我有一个包含如下

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 

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

在此先感谢

回答

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 
} 
+0

AWK -F,“NR> 1 {分裂($ 4, “|”);对于(i的一个)$ 4 = A [1];打印; $ 2 = $ 3 = 0}} NR == 1'OFS =,文件 – kattashri 2013-04-09 05:52:59

+0

我刚刚修改了上面的命令以适用于多行 – kattashri 2013-04-09 05:55:28

+0

您最好使用传统的for循环,以保证顺序。 – 2013-04-09 07:44:43

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 
+0

嗨肯特,感谢您的更好的答案,但如果我们认为在下一个级别。该命令仅适用于单个逗号分隔的行。 – kattashri 2013-04-09 05:45:38

+0

添加到上面的评论我认为我们需要改变循环计数 – kattashri 2013-04-09 05:48:05

+3

@kattashri如果你有更多的逗号分隔的行,你必须在循环后重置'i'。它看起来'awk -F,-v OFS =“,''NR> 1 {n = split($ 4,a,”|“); while(++ i <= n){$ 4 = a [i]; print ; $ 2 = $ 3 = 0;} i = 0} NR == 1'file'你的'for(i in a)'不安全。因为'我在'不能保证订单。 – Kent 2013-04-09 06:55:01