필드 1을 다른 행으로 분할하고 생성된 각 새 행에 대해 복사된 필드 2를 유지하는 방법

필드 1을 다른 행으로 분할하고 생성된 각 새 행에 대해 복사된 필드 2를 유지하는 방법

입력하다:

참고: 2개의 열은 탭으로 구분되며 일반 공백은 열 2의 단어를 구분합니다.

1   the mouse is dead
2   hit the wall
3   winter lasts forever

원하는 출력:

1   the
1   mouse
1   is
1   dead
2   hit
2   the
2   wall
3   winter
3   lasts
3   forever

awk이 길이 가는 길인가요?

답변1

첫 번째 필드는 행에 대한 필드 수를 보유하며 where 변수를 사용하여 필드에 액세스할 수 $1있으며 루프 는 C에서와 거의 동일하게 작동합니다. 그래서:NF$ii

$ awk '{for (i = 2; i <= NF; i++) printf "%s\t%s\n", $1, $i} ' < blah
1       the
1       mouse
...

(필드 구분 기호로 공백과 탭을 구분하지 않습니다.)

답변2

GNU 사용 sed:

sed -E 's/^((\S+\s+)\S+)\s+/&\n\2/;P;D'

POSIX 구문은 더욱 추악합니다 sed.

s='[[:space:]]\{1,\}' S='[^[:space:]]\{1,\}'
sed "s/^\(\($S$s\)$S\)$s/&\\
\2/;P;D"

답변3

또 다른 이상한:

~$>echo '1   the mouse is dead
2   hit the wall
3   winter lasts forever
' | awk 'BEGIN { RS="[[:space:]]+"; } /^[[:digit:]]+$/ {line=$1; next}; { print line "\t" $1; }'
1   the
1   mouse
1   is
1   dead
2   hit
2   the
2   wall
3   winter
3   lasts
3   forever

그리고 레이아웃이 조금 더 좋아졌습니다.

# split all parts into single word records.
BEGIN { RS="[[:space:]]+"; } 

# if the record is a number the save
/^[[:digit:]]+$/ { line=$1; next }; 
# else use last saved line number and this record to format output.
{ print line "\t" $1; }

답변4

awk와 함께 분할 기능을 사용할 수도 있습니다.

awk -F"\t" 'BEGIN { OFS="\t" } { cols=split($2,arr," "); for ( i=1; i<=cols; i++ ) { print $1,arr[i] }}'

관련 정보