입력하다:
참고: 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
$i
i
$ 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] }}'