
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