내 입력 데이터에는 탭으로 구분된 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 및 개행 변수를 정의합니다.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