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 に答える