아래 파일의 두 번째 열을 4자마다 분할하려고 합니다.
파일.txt
>1A THISISATEST
>1B THATISATEST
원하는 출력:
>1A THIS ISATEST
>1B THAT ISATEST
검색하고 수정을 시도한 후 다음 sed 명령을 사용해 보았습니다 sed 's/(.{4})(.{7}).*/\2 \3/' file.txt
. 그러나 나는 그것을 작동시킬 수 없는 것 같습니다. 내가 뭐 놓친 거 없니? 하지만 제안 사항이 있으면 awk
그것도 도움이 될 것입니다. 또한, 귀하의 제안에 대해 설명해주세요. 나는 awk
학습하는 과정에 있습니다 sed
.
답변1
여기에 해결책이 있습니다 awk
. 처음 4개 문자와 두 번째 열의 나머지 부분을 두 개의 변수로 분할하여 인쇄합니다.
]$ awk '{s=substr($2,1,4)}{g=substr($2,5,length($2))}{print $1,s,g}' file.txt
1A THIS ISATEST
1B THAT ISATEST
답변2
그리고 sed
:
sed 's/^[^ ]\+ \+[^ ]\{4\}/&\t/'
작동 방식:
^
:줄의 시작[^ ]\+
: 적어도 한 번 이상 공백 문자와 일치하지 않습니다.\+
: 공백 문자가 한 번 이상 일치합니다.[^ ]\{4\}
: 공백이 아닌 문자를 정확히 4번 일치합니다.&
: 일치하기 전의 모든 것//
\t
: 라벨
산출:
>1A THIS ISATEST
>1B THAT ISATEST
올바른 것은:
sed 's/^[^ ][^ ]* *[^ ]\{4\}/&\t/'
이 모드 는 GNU 확장이므로 posix 호환성을 위해 +
반복 문자와 a를 사용하여 에뮬레이트해야 합니다 .*
답변3
sed 's/ [^ ]\{1,4\}/& /' <in >out
>1A THIS ISATEST
작동합니다.<스페이스>공백 문자 바로 다음에 공백이 아닌 1~4개의 문자 시퀀스가 처음으로 나타나는 가장 긴 일치 항목 이후입니다. 즉, 줄이 공백으로 시작하면 공백이 아닌 첫 번째 시퀀스에 영향을 미칩니다.(이것은 틀림없이 올바른 행동입니다), 그렇지 않고 공백으로 구분된 두 번째 열이 4개 이하의 문자로 구성된 경우 해당 열에 추가 공백이 추가됩니다.(이것은 틀림없이 잘못된 행동입니다).
어떤 경우에도 공백을 대체하지 않습니다.모든두 번째 열의 공백이 아닌 네 번째 문자입니다. 단, 예제 입력을 예제 출력으로 변환합니다.
답변4
그리고GNU awk당신은 그것을 사용할 수 있습니다FPAT
awk '{$1=$1}1' OFS='\t' FPAT='>..\\s+\\w{4}|\\w*$'
표현식은 문자열의 나머지 부분 과
>..\\s+\\w{4}
일치>1A THIS
하고 일치합니다.\\w*$
$1=$1
출력 문자열에 새 구분 기호를 사용하도록 강제 적용OFS
1
대체품이다{print $0}