2016-09-21 8 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 | RED | SRC | 334 SRC | PIM2016.csv | MMRPPS | RED | 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 -Red | FI | 334 SRC | PIM2016.csv | MMRPPS | ST -Red | 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 -Red | GT | 725

+2

これまでに試したことや、具体的に苦労していることを分かち合うことができましたか? – wwkudu

+0

実際のデータには複数の行がありますか?もしそうなら、少なくとも2つのそのようなデータと予想される出力を使ってサンプル入力を変更できますか? – Sundeep

+0

@Sundeep:はい実際のデータは2行以上です。私はサンプルデータを変更します – 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配列にカンマ区切り値を抽出します。正規表現は、他のすべての行に対して非,文字
  • の文字列を探し
    • 所望の順序
+0

@ sundeep:このスクリプトの動作が望まれます。どうもありがとう。しかし、スペースが間にある場合(例:入力:総計、出力:合計)、単語の第2部分のみを取ります。これを解決することは可能ですか? – udayadevan

+0

@udayadevan '(\ w +)'を '([\ w] +)'に置き換え、このサンプルデータを反映するように質問を編集してください – Sundeep

0

@sundeepに@bアレイ

  • プリントにカンマ区切り値を抽出するために同一の正規表現: ご回答有難うございます。下のスクリプトの動作

    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

    関連する問題