다음 형식의 목록이 있습니다.
group1;visitor1,visitor2,visitor3,
group2;visitor4,visitor5
위 목록에서 다음을 통해 목록을 생성해야 합니다.
group1,visitor1
group1,visitor2
group1,visitor3
group2,visitor4
group2,visitor5
답변1
이것은매우~처럼배열과 함께 AWK 사용그리고 다른 문제들. 주요 아이디어는 두 번째 필드부터 시작하여 첫 번째 필드 앞의 별도 줄에 각 필드를 인쇄하는 것입니다.
이 경우 필드 구분 기호를 ,
or 로 지정 ;
하고 빈 필드가 인쇄되지 않는지 확인합니다(주어진 데이터의 첫 번째 행 끝에 빈 필드가 있음). 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
현재 입력 줄의 각 방문자 앞에 그룹 이름을 추가합니다.