각 행에 동일한 수의 열이 있는 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