다른 행의 첫 번째 열 내용을 분리하는 방법

다른 행의 첫 번째 열 내용을 분리하는 방법

내 입력 데이터에는 탭으로 구분된 5개의 열이 있습니다.

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

첫 번째 열에서 쉼표로 데이터를 구분할 때 다음과 같이 두 번째부터 다섯 번째 열까지 동일한 정보가 포함된 다른 행으로 구분하고 싶습니다.

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

관련 정보