각 줄에서 첫 번째 문자 교체를 건너뛰는 방법은 무엇입니까? [복사]

각 줄에서 첫 번째 문자 교체를 건너뛰는 방법은 무엇입니까? [복사]

다음과 같은 형식의 파일이 있습니다.

Y15-SUB-B04-P17-BK_M02734_4_000000000-ANNUF_1_1111_24724_4878;size=1;
Y15-SUB-B05-P22-LM_M02734_4_000000000-ANNUF_1_1111_20624_14973;size=1;
Y15-SUB-B05-P22-LM_M02734_4_000000000-ANNUF_1_1103_11326_10379;size=1;

첫 번째 항목을 제외하고 모든 밑줄(_)을 콜론(:)으로 바꾸고 싶습니다. 나는 다음과 같은 출력을 원합니다 :

Y15-SUB-B04-P17-BK_M02734:4:000000000-ANNUF:1:1111:24724:4878;size=1;
Y15-SUB-B05-P22-LM_M02734:4:000000000-ANNUF:1:1111:20624:14973;size=1;
Y15-SUB-B05-P22-LM_M02734:4:000000000-ANNUF:1:1103:11326:10379;size=1;

sed -i '' 's/_/:/g' old_file이것을 사용 하여 ALL(또는 )을 바꿀 수 sed 's/_/:/g' old_file > new_file있고 숫자를 추가하여 두 번째, 네 번째 정도의 항목만 바꿀 수 있다는 것을 알고 있습니다 .

sed 's/_/:/2' old_file > new_file

그러나 첫 번째 행을 제외한 각 행의 모든 ​​항목을 바꾸는 방법은 무엇입니까?

답변1

GNU 사용 sed(다른 버전에서는 다르게 동작할 수 있습니다. 감사합니다.글렌 잭맨):

 sed -i'' 's/_/:/2g' file

이렇게 하면 각 줄의 첫 번째 항목을 건너뛰 _도록 모든 것이 변경됩니다 .:

답변2

우리가 좋아하는 구조 만 사용하세요 Posix-sed:

$ sed -e '
     y/_/\n/
     s/\n/_/
     y/\n/:/
' inp.file

Stephane의 제안에 따르면 다른 방법은 다음과 같습니다.

$ perl -pe 's/(^\G.*?_)?.*?\K_/:/g' inp.file 

$ perl -pe 'my $n; s/_/$n++?":":$&/ge' inp.file 

$ perl -pe 's/_\K(.*)/$1 =~ y|_|:|r/e' inp.file 

답변3

어크 괜찮아? 필드 구분 기호 로 사용하여 _인쇄할 수 있습니다.

<field 1>_<field 2>:<field n>:<field n+1>:...

이와 같이:

awk -F_ '{ printf("%s_%s", $1, $2); for (x = 3; x <=NF; x++) { printf(":%s", $x); }; printf("\n"); }'

각 행의 구조가 동일한 경우 루프를 피하기 위해 필드 수를 하드코딩할 수 있습니다(매우 대략적인 예비 실험을 기준으로 실행 시간은 약 2/3입니다).

awk -F_ '{printf("%s_%s:%s:%s:%s:%s:%s:%s\n", $1, $2, $3, $4, $5, $6, $7, $8);}'

답변4

루프가 없는 또 다른 간단한 awk스크립트(표준 Linux ) 는 다음과 같습니다 .gawk

cat script.awk
match($0,/^[^_]*_/,a){ # match current line to first _ (including) into a[0] variable
   sub(a[0],"");       # remove a[0] from current line
   gsub("_",":");      # replace all _ to : in current line
   print a[0]""$0;     # output a[0] and current line
}

달리기:

awk -f script.awk input.txt

또는:

awk 'match($0,/^[^_]*_/,a){sub(a[0],"");gsub("_",":");print a[0]""$0;}' input.txt

관련 정보