주어진 위치에 쉼표를 삽입하는 방법은 무엇입니까?

주어진 위치에 쉼표를 삽입하는 방법은 무엇입니까?

각 행에 동일한 수의 열이 있는 100MB가 넘는 텍스트 파일이 있습니다.

Column No.: 0 1 2 3 4 5 6
            d x c c s b c
            .............

,특정 위치에 추가하고 싶습니다 . 예를 들어,location = 2, 3, 5

원하는 출력은 다음과 같습니다.

Column No.:  0 1 2  3  4 5  6
             d x c, c, s b, c
             .............

위치 파일은 다음과 같습니다.텍스트또는데이터 세트문서

2
3
5

텍스트 파일에는 구분 기호가 있어야 합니다.

고쳐 쓰다:

견본

여기에 이미지 설명을 입력하세요.

  • 참고: 개행 문자는 구분 기호를 삽입하려는 위치입니다.
  • 열 번호는 행 시작 부분의 바이트 오프셋입니다.

답변1

Sed를 사용하십시오.

0 인덱스 위치를 사용하지 않고 1부터 시작합니다. 그래서 제공해주신 숫자를 늘렸습니다.

또한 첫 번째 열을 변경하면 열 위치가 변경되므로 뒤에서 앞으로 이동해야 합니다. 따라서 Sed를 다음과 같이 사용하십시오.

sed 's/./&,/6;s/./&,/4;s/./&,/3'

예:

$ echo dxccsbc
dxccsbc
$ echo dxccsbc | sed 's/./&,/6;s/./&,/4;s/./&,/3'
dxc,c,sb,c
$ 

  • Sed의 명령은 s대체에 사용됩니다.
  • 이 패턴은 .모든 단일 문자와 일치합니다.
  • 대체 텍스트에서 &"일치하는 텍스트"를 의미하며 쉼표는 문자 그대로의 쉼표입니다.
  • 마지막 숫자 뒤의 숫자 플래그는 /해당 줄의 "n"번째 발생에서만 교체를 수행한다는 의미입니다.

당신이되고 싶다면진짜이상하게도 Bash 중괄호 확장은 Sed 명령을 만드는 데 사용됩니다.

$ echo dxccsbc | sed '-es/./&,/'{6,4,3}
dxc,c,sb,c

그러나 이것은 단지 금상첨화일 뿐이며 Sed와 Bash를 잘 알지 않는 한 혼란스러울 수 있습니다. :)


별도의 파일에서 채용정보를 추출하고 싶은 경우(실제로 질문에 표시한 대로) 다음과 같이 할 수 있습니다.

sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file

이는 POSIX가 아닌 프로세스 대체 구문을 사용하므로 Bash에만 해당됩니다. 또한 나는 이것을 매우 강력하게 만들었지만 실제로는 그렇지 않습니다.숫자0으로 시작하지 않는 위치 파일은 삭제됩니다.

시험 결과:

$ cat file 
abcdefg
ABCDEFG
abcdelaksjdflkjsdflli
sdlfihsdlfkj
$ cat positionsfile 
2
15
5
7something
01
not a number
$ sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
ab,cde,fg
AB,CDE,FG
ab,cde,laksjdflkj,sdflli
sd,lfi,hsdlfkj
$ 

답변2

그리고 perl:

#!/usr/bin/env perl

my @pos;

while (<>)
    { push @pos, 1 + int; }
continue
    { last if eof; }

@pos = sort { $b cmp $a } @pos;

while (<>) {
    for my $k (@pos)
        { s/^.{$k}\K/,/; }
    print;
}

다음과 같이 실행하세요:

script.pl positions.txt file.txt

관련 정보