別の行の最初の列の内容を分離する方法

別の行の最初の列の内容を分離する方法

私の入力データには、タブで区切られた5つの列があります。

Class1,Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4,Class5 info1b info2b1,info2b2 info3b info4b

最初の列からコンマでデータを区切るときは、次のように2番目から5番目の列まで同じ情報を含む別の行に分割したいと思います。

Class1 info1 info2 info3 info4
Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4 info1b info2b1,info2b2 info3b info4b
Class5 info1b info2b1,info2b2 info3b info4b

私は何をすべきかわかりません。どんな提案がありますか?

答え1

アッ解決策:

awk '$1~/.+,.+/{ split($1,a,","); $1=""; sub(/^ */,"",$0); 
     for(i=1;i<=length(a);i++) print a[i],$0; next }1' file

出力:

Class1 info1 info2 info3 info4
Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4 info1b info2b1,info2b2 info3b info4b
Class5 info1b info2b1,info2b2 info3b info4b

  • $1~/.+,.+/- 最初の列にカンマ区切りの項目が含まれている場合は行を処理します。
  • split($1,a,",")- 最初の列を項目配列に分割

答え2

perl -F'\t' -lane '$,="\t";
   print $_, @F for split /,/, splice @F, 0, 1;
' yourfile

結果

Class1  info1   info2   info3   info4
Class2  info1   info2   info3   info4
Class3  info1a  info2a  info3a  info4a
Class4  info1b  info2b1,info2b2 info3b  info4b
Class5  info1b  info2b1,info2b2 info3b  info4b

答え3

POSIX sed

TAB=$(printf \\t) NL=$(printf \\nn | sed -e '$!s/$/\\/')
sed -e "s/^\([^,${TAB}]*\),\([^${TAB}]*\)\(.*\)/\1\3${NL%?}\2\3/;P;D" yourfile

まず、エスケープシーケンスなしで二重引用符で囲まれたsedコマンドに使用でき、\tそれぞれsedコマンドとsedコマンドでは\n使用できないTAB変数と改行変数を定義します。POSIXlhsrhss///


結果

Class1  info1   info2   info3   info4
Class2  info1   info2   info3   info4
Class3  info1a  info2a  info3a  info4a
Class4  info1b  info2b1,info2b2 info3b  info4b
Class5  info1b  info2b1,info2b2 info3b  info4b

関連情報