첫 번째 문자열을 기준으로 행을 키-값 쌍으로 분할

첫 번째 문자열을 기준으로 행을 키-값 쌍으로 분할

다음과 같이 파일의 한 줄을 여러 줄로 분할하는 쉬운 방법이 있는지 궁금합니다.

나는 가지고있다

A B C
1 2 3 4

나는 줄의 첫 번째 문자열을 기반으로 다음과 같은 것을 얻고 싶습니다.

A B
A C
1 2
1 3
1 4

기본적으로 줄의 첫 번째 문자열을 기반으로 두 번째, 세 번째, 네 번째 문자열로 여러 줄을 만듭니다.

답변1

시작

awk '{for (i=2; i<=NF; ++i) print $1, $i}' file
A B
A C
1 2
1 3
1 4

답변2

printf %s\\n 'A B C' '1 2 3 4'|
sed -e's/\([^ ]*\)  *[^ ]*/&\n\1/;//P;D'

A B
A C
1 2
1 3
1 4

이것은 작동합니다. 하나 이상의 공백으로 구분된 0개 이상의 공백이 아닌 문자의 처음 두 시퀀스를 선택합니다. 첫 번째 시퀀스는 에서 참조되며 \1전체 선택 항목은 에 있습니다 &. 선택 항목은 자체로 대체되고 \n그 뒤에 ewline이 대체됩니다 \1. 그런 다음 패턴 공간은 개행이 처음 나타나는 위치에 인쇄된 다음 동일한 부분이 제거되고 D패턴 공간은 나머지 부분과 함께 스크립트 상단으로 재활용됩니다.

ook 명령을 사용하여 그것이 무엇을 하는지 볼 수 있습니다 l. 교체 P하고 교체하기 전에 다른 것을 넣으세요 l...ls///


A B C$
A B\nA C$
A C$
A C\nA$
A$
1 2 3 4$
1 2\n1 3 4$
1 3 4$
1 3\n1 4$
1 4$
1 4\n1$
1$

printf %s\\n 'A B C' '1 2 3 4'|
sed -ne:t -e'/  *[^ ]*/{s//\n&/2;P;s///;} -ett

A B
A C
1 2
1 3
1 4

최소한 일련의 공백 문자와 후행 공백이 아닌 문자가 있는 패턴 공간과 일치합니다. 첫 번째 대체는 해당 시퀀스가 ​​두 번째 발생하기 전에 개행을 삽입한 다음 P개행으로 인쇄하고, 두 번째는 패턴의 첫 번째 발생을 제거합니다. 이제 시퀀스 끝에 추가된 첫 번째 개행도 포함합니다. 문자가 작동하는 순서 두 번째에. est는 대체가 발생할 때마다 레이블로 다시 분기되므로 공백으로 t구분된 필드를 한 번에 하나씩 패턴 공간을 차지합니다.:tsed

확인을 다시 사용하세요 l.


A B C$
A B\n C$
A C$
A C$
1 2 3 4$
1 2\n 3 4$
1 3 4$
1 3\n 4$
1 4$
1 4$

답변3

배쉬 사용 -

    while read x ; do set $x ; first=$1 ; shift; for i in $* ; do echo $first  $1; shift; done  ; done  < /tmp/1
    A B
    A C
    1 2
    1 3
    1 4

관련 정보