2016-09-23 49 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|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,FI,QMA,PCG,PCC,PREI,G T 
PIM2016.csv,MMR.S T - RED,334,114,120,34,123,725 

與最新的腳本輸出:

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]中,爲什麼用[tag:awk]標記? –

+3

@TomFenech:顯然規範已經改變:-) http://stackoverflow.com/questions/39612637/unix-awk-scripting-to-convert-columns-to-rows。祝你們好運。 – shellter

回答

1

我覺得你的生活變得輕鬆很多,如果你知道split()

#!/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); 
} 

我寫它作爲一個程序,而不是作爲一個命令行,因爲我認爲這是太長,可以在命令中運行線。

此外,我希望您的示例輸入中「MMR」之後的點是逗號的錯字。如果情況並非如此,它會變得更復雜一些 - 但不是很多。

哦,你的示例輸入中沒有「PPS」,所以我不知道你的示例輸出來自哪裏。

相關問題