
다음 형식의 목록이 있습니다.
group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5
위 목록에서 다음과 같은 방법으로 목록을 생성해야 합니다.
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
답변1
이것은매우비슷하다배열에 AWK 사용그리고 몇 가지 다른 질문이 있습니다. 주요 아이디어는 첫 번째 필드 앞에 추가된 별도의 줄에 필드 2부터 각 필드를 인쇄하는 것입니다.
이 경우 필드 구분 기호가 또는 임을 지정 ,
하고 ;
빈 필드를 인쇄하지 않도록 합니다(주어진 데이터의 첫 번째 줄 끝에 빈 필드가 있음). OFS
명령줄에서 설정한 변수 는 -v
출력 필드를 구분하는 데 사용되는 출력 구분 문자열이며 NF
줄의 필드 수입니다.
awk -F '[,;]' -v OFS=',' '{ for (i = 2; i <= NF; ++i) if ($i != "") print $1, $i }' file
질문의 데이터를 고려하면 다음이 생성됩니다.
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
답변2
이는 다음과 같이 GNU sed를 사용하여 수행할 수 있습니다.
sed -r 's:,$::;y:;,:,;:;:l;s:^(([^,]+)[^;]+);:\1\n\2,:;tl' file
각 입력 줄에 대해 후행 쉼표가 있으면 삭제하고 인쇄에 도움이 되도록 쉼표를 세미콜론으로 전환합니다. 그런 다음 현재 입력 줄의 각 방문자 :l
앞에 tl
그룹 이름을 추가하기 위해 검색 및 바꾸기 루프를 실행합니다 .