2016-09-21 81 views
0

需要幫助將行轉換爲unix腳本中的列。我的來源是文件系統。Unix awk腳本將列轉換爲行

嘗試下面的腳本:

`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 

input data from file: 

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

與最新的腳本輸出:

SRC | PIM2016.csv | MMRPPS |紅色| SRC | 334 SRC | PIM2016.csv | MMRPPS |紅色| FI | 114 SDRC | 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 | GT |

需要的輸出:

SRC | PIM2016.csv | MMRPPS | ST - 紅| FI | 334 SRC | PIM2016.csv | MMRPPS | ST - 紅| QMA | 114 SRC | PIM2016。 csv | MMRPPS | ST -RED | PCG | 120 SRC | PIM2016.csv | MMRPPS | ST -RED | PCC | 34 SRC | PIM2016.csv | MMRPPS | ST -RED | PREI | 123 SRC | PIM2016.csv | MMRPPS | ST - 紅| GT | 725

+2

也許你可以分享你到目前爲止已經嘗試過,以及你在哪裏專門掙扎? – wwkudu

+0

你的實際數據是否有兩行以上?如果是這樣,你能用至少兩個這樣的數據和期望的輸出來修改你的樣本輸入嗎? – Sundeep

+0

@Sundeep:是超過兩行的實際數據。我會修改樣本數據 – udayadevan

回答

0
$ cat ip.txt 
HDR :FI,QA,PC,PM,PRE,G T 
Detail row: MMRPPS,ST - RED,334,114,120,34,123,725 
      UP,UPR,0,0,0,0,0,0 

假設行之間沒有空行:

$ perl -nle ' 
s/^.*:\s*|^\s*|\s*$//; 
if($. == 1) 
{ (@a) = /[^,]+/g } 
else 
{ 
    (@b) = /[^,]+/g; 
    print "$b[0] $a[$_] $b[1] $b[$_+2]" foreach (0..$#a); 
} 
' ip.txt 
MMRPPS FI ST - RED 334 
MMRPPS QA ST - RED 114 
MMRPPS PC ST - RED 120 
MMRPPS PM ST - RED 34 
MMRPPS PRE ST - RED 123 
MMRPPS G T ST - RED 725 
UP FI UPR 0 
UP QA UPR 0 
UP PC UPR 0 
UP PM UPR 0 
UP PRE UPR 0 
UP G T UPR 0 
  • 輸入線預處理以去除前導文字高達:,任何前導和尾隨的空格
  • 從第一行,提取逗號分隔值成@a陣列。正則表達式查找的非,字符
  • 對於所有其它行的字符串,
    • 相同的正則表達式中所希望的順序來提取逗號分隔值成@b陣列
    • 打印
+0

@ sundeep:這個腳本的作品是理想的。非常感謝。但是,如果空格在兩者之間(例如:輸入:總計,輸出:總計),則只取第二部分的詞。有沒有可能解決這個問題? – udayadevan

+0

@udayadevan嘗試用'([\ w] +)替換'(\ w +)'......並編輯您的問題以反映此示例數據 – Sundeep

0

@sundeep : 感謝您的回答。腳本作品下面

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

請參閱我編輯的答案和[當某人回答我的問題時該怎麼辦?] (http://stackoverflow.com/help/someone-answers) – Sundeep