특정 위치에 쉼표를 삽입하는 방법은 무엇입니까?

특정 위치에 쉼표를 삽입하는 방법은 무엇입니까?

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
             .............

위치 파일은 다음과 같습니다.텍스트또는CSV파일

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

관련 정보