2016-09-23 10 views
-3

スクリプトを試してみました:Unixのスクリプト

perl -nle ' 
if($. == 1) 
{ (@a)=/([\w - .]+)(?=,|\s*$)/g } 
else 
{ 
    (@b)=/([\w - .]+)(?=,|\s*$)/g; 
    print "$a[0]|$b[0]|$b[1]|$b[2}|$a[$_]|$b[$_+3]" foreach (0..$#a) 
} 
' ip.txt >op.txt 

入力データ:最新のスクリプトで

src,FI,QMA,PCG,PCC,PREI,G T 
PIM2016.csv,MMR.S T - RED,334,114,120,34,123,725 

出力:

SRC|PIM2016.csv|MMRPPS|RED|SRC|334 
SRC|PIM2016.csv|MMRPPS|RED|FI|114 
SRC|PIM2016.csv|MMRPPS|RED|QMA|120 
SRC|PIM2016.csv|MMRPPS|RED|PCG|34 
SRC|PIM2016.csv|MMRPPS|RED|PCC|123 
SRC|PIM2016.csv|MMRPPS|RED|PREI|725 
SRC|PIM2016.csv|MMRPPS|RED|G T| 

必要な出力を:

SRC|PIM2016.csv|MMRPPS|S T - RED|FI|334 
SRC|PIM2016.csv|MMRPPS|S T - RED|QMA|114 
SRC|PIM2016.csv|MMRPPS|S T - RED|PCG|120 
SRC|PIM2016.csv|MMRPPS|S T - RED|PCC|34 
SRC|PIM2016.csv|MMRPPS|S T - RED|PREI|123 
SRC|PIM2016.csv|MMRPPS|S T - RED|G T|725 
+2

あなたの現在の試みが[tag:perl]にある場合、[タグ:awk]でタグ付けされたのはなぜですか? –

+3

@TomFenech:明らかに仕様が変更されました:-) http://stackoverflow.com/questions/39612637/unix-awk-scripting-to-convert-columns-torows。皆さんお元気で。 – shellter

答えて

1

私はあなたの人生はあなたが知っていれば非常に簡単になると思いますについて、私はそれがコマンドで実行することが長すぎると思うように私はプログラムとしてではなく、コマンドラインとして、それを書いた

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

my (@head); 
while (<>) { 
    chomp; 
    if ($. == 1) { 
    @head = split /,/; 
    next; 
    } 

    my @data = split /,/; 

    say "$head[0]|$data[0]|$data[1]|$data[2]|$head[$_]|$data[$_+2]" for (1 .. $#head); 
} 

split()ライン。

また、サンプル入力の「MMR」の後のドットがカンマの入力ミスであることを願っています。そうでない場合、それはもう少し複雑になりますが、それほど多くはありません。

ああ、あなたのサンプル入力には "PPS"がありません。そのため、サンプル出力にどこから来たのか分かりません。

関連する問題