다음과 같이 파일의 한 줄을 여러 줄로 분할하는 쉬운 방법이 있는지 궁금합니다.
나는 가지고있다
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
...l
s///
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
구분된 필드를 한 번에 하나씩 패턴 공간을 차지합니다.:t
sed
확인을 다시 사용하세요 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