2017-12-19 25 views
2

2つの列を持つ.txtファイル(タブ区切り)があります。最初の列にはカンマ区切りの複数の値があります。入力フォーマットカンマ区切りのセル(さまざまなエントリ)を新しい行に区切ります。

a,b,c x 
a  y 
c,d,e z 

所望の出力は、カンマで区切られたエントリの

a x 
b x 
c x 
a y 
c z 
d z 
e z 

数が1~40の間で変化しています。私は、awkコマンド以下しようとしたが、最初の列に2つのカンマ区切りのエントリがある場合にのみ動作します:

awk 'BEGIN{FS="[  ,]"} {print $1, $NF; print $2, $NF}' input 

どうやって仕事をすることができます上記のコマンド(または新しい何かを)変更することができます。ありがとう。救助へ

答えて

3

awk

$ awk -F',| +' '{for(i=1;i<NF;i++) print $i,$NF}' 

は最後のフィールドで(最後のフィールドまで)空間(S)またはカンマ、すべてのフィールドの印刷対フィールド区切りを設定し使用し、同様のままであります。

2

のawkのsplit機能:

awk '{split($1,arr,","); for (key in arr) { print arr[key],$2 }}' input 
+0

非常に素晴らしいソリューション!ありがとう – Allan

+0

あなたは、 'in'演算子の好意的な順番で行を出力することに言及する必要があります。 –

+0

これは、OPに表示されるように、望ましい出力を生成しません。 – user3439894

2

Perlの救助に!

perl -lane 'print "$F[0] $_ $F[2]" for glob "{$F[1]}"' file 
  • -n
  • -lによって入力ラインが
  • globはコンマを拡張入力から改行を除去し、@F配列に空白に
  • -aスプリット各ラインを印刷するためにそれらを加算読み出し中括弧で区切られたリストはシェルと同様に

更新:仕様を変更しました(更新をマークしません)。溶液はわずか

perl -lane 'print "$_ $F[1]" for glob "{$F[0]}"' file 
1
BEGIN { 
    FS = "\t" 
} 

NF == 2 { 
    n = split($1, a, ",") 
    for (i = 1; i <= n; i++) { 
     print a[i], $2 
    } 
} 
0

これは(GNU SED)あなたのために働くかもしれない:

sed -r 's/\s+(\S+)$/ \1/;s/,(.*(\S+))$/\2\n\1/;P;D' file 

は、現在の行から余分なスペースを削除してください。各,を空白で置き換え、現在の行の最後のフィールドの後に改行を続けます。現在の行の最初の行を印刷し、最初の行を削除して繰り返します。

0

あなたが分離出力]タブを取得し、このsedはあまりにも

sed -E ':A;s/([^,]*),(.*)(\t.*$)/\1\3\n\2\3/;tA' infile 

を使用することができます。

あなたは、このタブを使用しない場合:

sed -E ':A;s/([^,]*),(.*)(\t.*$)/\1\3\n\2\3/;tA;s/\t/ /g' infile 
関連する問題