행 반복, 필드 분할

행 반복, 필드 분할

각 줄에 다음과 같은 탭으로 구분된 파일이 있습니다.

K00001;K00004;K00008    0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0

다음과 같이 고유한 코드와 동일한 일련의 숫자가 있는 행을 원합니다.

K00001 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0    
K00004 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0    
K00008 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0

답변1

awk를 사용하여 첫 번째 열을 분할할 수 있습니다.

~$ awk '{split($1,a,";"); $1="";for (i in a){print a[i],$0}}' myfile
K00001  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0
K00004  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0
K00008  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0

;( )에서 첫 번째 열을 분할한 split($1,a,";")다음 이를 제거하여 $0배열의 각 항목에 대한 전체(새) 행을 인쇄합니다( ).


댓글에서 제안한 대로 편집 후 탭 문자가 구분 기호로 사용되는 것을 볼 수 있습니다. 탭을 출력 필드 구분 기호로 사용하려면 OFS="\t"예를 들어 BEGINawk 섹션을 사용할 수 있습니다 . 또한 빈 필드가 삽입됩니다 $1="". 따라서 print 대신 a[i]then print 로 $0설정하십시오 .$1a[i]$0

~$ awk 'BEGIN{OFS="\t"}{split($1,a,";"); for (i in a){$1=a[i];print}}' myfile
K00001  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0
K00004  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0
K00008  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0

답변2

원하는 대로 작동해야 합니다. 기본적으로 첫 번째 필드(키) 를 분할하고 분할을 첫 번째 필드로 제한하여 $k나머지 필드를 넣습니다. 그런 다음 키를 분리하고 나머지 필드와 함께 각 키를 한 줄에 인쇄합니다.$f\t2;

perl -nle '($k, $f) = split "\t", $_, 2; print "$_\t$f" for split ";", $k'

-n루프 입력. 파일을 Perl로 파이프하거나 명령줄 끝에 입력 파일 이름을 전달할 수 있습니다. -l자동 줄 끝 관리를 활성화합니다.

답변3

그리고 sed:

sed 's/^\([^[:blank:];]*\);\([^[:blank:]]*\)\(.*\)/\1\3\
\2\3/;P;D'

답변4

또 다른 Perl 설명입니다.

$ perl -pe 's/^([^;]+);([^;]+);(\S+)\s+(.*)/$1 $4\n$2 $4\n$3 $4/' file
K00001 0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0
K00004 0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0
K00008 0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0

또 다른 sed 단일 라이너.

$ sed 's/^\([^;]\+\);\([^;]\+\);\([^ ]\+\) \+\(.*\)/\1 \4\n\2 \4\n\3 \4/' file
K00001 0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0
K00004 0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0
K00008 0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0

관련 정보