각 줄에 다음과 같은 탭으로 구분된 파일이 있습니다.
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"
예를 들어 BEGIN
awk 섹션을 사용할 수 있습니다 . 또한 빈 필드가 삽입됩니다 $1=""
. 따라서 print 대신 a[i]
then print 로 $0
설정하십시오 .$1
a[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
\t
2
;
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