テキスト処理にUnixツールを使用する

テキスト処理にUnixツールを使用する

次の形式のファイルがあります。

abc|xyz|mno  
x up x  
up up x  
x x up  

abc|xyz|mno  
x x x  
up x x  

....  
....

デフォルトでは、ファイルの最初の行はデバイス名、(|ed)次の行はデバイスの状態です。

出力を次の形式にしたいと思います。

abc,x|xyz,up|mno,x  
abc,up|xyz,up|mno,x  
abc,x|xyz,x|mno,up  

abc,x|xyz,x|mno,x  
abc,up|xyz,x|mno,x  

....  
....  

アドバイスはありますか?

ベストアンサー1

CPANのモジュールperlで使用できる場合:List::MoreUtils

$ perl -MList::MoreUtils=pairwise -F'\|' -anle '
    print and next if /^$/;
    @dev = @F and next if @F > 1;
    print join "|", pairwise {"$a,$b"} @dev,@{[split]};
' file
abc,x|xyz,up|mno,x
abc,up|xyz,up|mno,x
abc,x|xyz,x|mno,up

abc,x|xyz,x|mno,x
abc,up|xyz,x|mno,x

外部モジュールを使用したくない場合:

$ perl -F'\|' -anle '
    print and next if /^$/;
    @dev = @F and next if @F > 1;
    @state = split;
    print join "|", map {"$dev[$_],$state[$_]"} 0..$#dev;
' file

おすすめ記事