私の入力データには、タブで区切られた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変数と改行変数を定義します。POSIX
lhs
rhs
s///
結果
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