내 데이터는 다음과 같습니다.
$ cat input
1212103122
1233321212
0000022221
출력이 다음과 같기를 원합니다.
$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
나는 시도했다:
sed -i 's// /g' input > output
하지만 작동하지 않습니다.
어떤 제안이 있으십니까?
답변1
이것은 나에게 효과적입니다.
sed 's/./& /g' input > output
$ cat input
1212103122
1233321212
0000022221
$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
답변2
당신을 위한:
sed 's/\(.\{1\}\)/\1 /g' input > output
변경 사항을 그대로 저장하려면 다음을 수행하세요.
sed -i 's/\(.\{1\}\)/\1 /g' input
작동 방식:
s/\(.\{1\}\)/\ /g
1자마다 공백이 추가됩니다.
예를 들어 다음과 같은 출력 파일을 원하는 경우:
12 12 10 31 22
12 33 32 12 12
00 00 02 22 21
내 답변을 다음과 같이 편집할 수 있습니다.
sed -i 's/\(.\{2\}\)/\1 /g'
따라서 2자마다 공백이 추가됩니다.
또한 는 /\1 /
와 동일하며 /&
공백을 추가합니다. 예를 들어 다음 세 개를 추가합니다: /\1 /
또는 /& /
. 더 많은 옵션을 사용할 수 있습니다. Sed는 매우 강력한 도구입니다.
또한예, @Law29에서 언급했듯이 제거하지 않으면 각 줄 끝에 공백이 남게 됩니다. 따라서 공백이 추가될 때 제거하려면 s/ $//
주어진 솔루션 끝에 a를 추가하면 됩니다. :
sed 's/./& /g; s/ $//'
이게 도움이 되길 바란다.
답변3
-i
파일을 그 자리에서 편집하도록 선택할 수 있습니다 . 이로 인해 올바른 솔루션을 찾지 못할 수도 있습니다.
sed
문제는 허용되지 않는 빈 문자열을 일치시키려고 한다는 것입니다 . 대신, 임의의 문자와 일치하고 이를 동일한 문자 뒤에 공백이 오는 문자로 바꿉니다. 이렇게 하면 각 줄 끝에 공백이 남게 되며, 다른 sed를 사용하여 제거할 수 있습니다.
$ cat input
1212103122
1233321212
0000022221
$ sed -e 's/./& /g' -e 's/ $//' input > output
$ cat output
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1
$
답변4
옵션 은 다음과 같습니다 awk
.
awk -F '' '{$1=$1}1' input > output
작동 원리는 다음과 같습니다.
빈 필드 구분 기호를 설정하여
-F ''
입력 레코드(행)를 단일 문자로 분할합니다.평가를 통해
$1=$1
기본 출력 필드 구분 기호(공백)를 사용하여 레코드를 강제로 다시 작성합니다.1
true이므로 결과를 인쇄하세요.
Perl에서도 비슷한 트릭이 있습니다:
perl -F'' -alne 'print join " ", @F' input > output
표시하려면:
$ awk -F '' '{$1=$1}1' input
1 2 1 2 1 0 3 1 2 2
1 2 3 3 3 2 1 2 1 2
0 0 0 0 0 2 2 2 2 1