열에서 다음을 어떻게 변환할 수 있습니까?
1
2
3
4
5
6
.
.
.
.
98
99
100
쉼표로 구분된 줄로:
1,2,3,4,5,6,....,98,99,100
저는 리눅스를 사용하고 있습니다.
답변1
paste
다음과 같이 명령을 사용할 수 있습니다 .
paste -sd, file.txt
기본적으로 paste
"각 파일의 순차적으로 해당 라인으로 구성된 탭으로 구분된 라인을 표준 출력에 기록합니다"(매뉴얼에서 인용). 이 -d
옵션은 대체 출력 구분 기호를 설정하며, 이 -s
옵션을 사용하면 병렬이 아닌 한 번에 하나의 파일을 붙여넣을 수 있습니다. 단일 파일의 경우 이 옵션을 사용하면 파일을 한 번에 한 줄씩 처리합니다.
답변2
다음은 몇 가지 방법입니다(비록루익의 paste
방법아마도 최고일 것입니다):
tr
$ tr '\n' , < file 1,2,3,4,5,6,.,.,.,.,98,99,100,$
이렇게 하면 모든 줄 바꿈이 쉼표로 바뀌지만 이는 마지막 줄 바꿈도 변경되므로 다시 추가해야 함을 의미합니다(이것은 GNU 가정
sed
하지만 일반적으로 Linux 시스템에서는 줄 바꿈입니다).$ tr '\n' , < file | sed 's/,$/\n/' 1,2,3,4,5,6,.,.,.,.,98,99,100
진주&
sed
$ perl -pe 's/\n/,/' file | sed 's/,$/\n/' 1,2,3,4,5,6,.,.,.,.,98,99,100
Perl만 사용하기
$ perl -lne 'push @l,$_; END{print join ",",@l; }' file 1,2,3,4,5,6,.,.,.,.,98,99,100
또는:
$ perl -0777 -pe 's/\n/,/g; s/,$/\n/;' file 1,2,3,4,5,6,.,.,.,.,98,99,100
-0777
Perl에게 파일을 "후루룩 소리를 내며" 전체 파일을 메모리로 읽도록 지시합니다 . 그런 다음 모든 개행 문자를 쉼표로 바꾸고 마지막 쉼표를 개행 문자로 바꿉니다. 방법-pe
"피애플리케이션-e
".두 방법 모두 전체 파일을 메모리에 저장하므로 매우 큰 파일에는 적합하지 않을 수 있습니다.
awk
&sed
$ awk -v ORS="," '1' file | sed 's/,$/\n/' 1,2,3,4,5,6,.,.,.,.,98,99,100
순수하다
awk
(고마워요에드 모튼댓글에서 이 방법을 제공한 사람)$ awk '{printf "%s%s", sep, $0; sep=","} END{print ""}' file 1,2,3,4,5,6,.,.,.,.,98,99,100
1
"인쇄"의 약어입니다 . awk에서는 어떤 것이 true로 평가되면 기본 동작은 현재 줄을 인쇄하는 것이므로 항상 true이기1
때문에 자주 사용됩니다 .1
답변3
GNU 사용 datamash
:
$ datamash -t , transpose <file
1,2,3,4,5,6,.,.,.,.,98,99,100
또한 다음으로 구성된 경우 데이터가 올바르게 전치됩니다.많은 종류의쉼표로 구분된 열(예:단순한CSV 형식):
$ cat f
1,1,1,1
2,2,2,2
3,3,3,3
4,4,4,4
5,5,5,5
6,6,6,6
.,.,.,.
.,.,.,.
.,.,.,.
.,.,.,.
98,98,98,98
99,99,99,99
100,100,100,100
$ datamash -t , transpose <f
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100
1,2,3,4,5,6,.,.,.,.,98,99,100
답변4
sed
완전성을 위해 솔루션은 다음과 같습니다.
% cat =commas
#!/bin/bash
# Other ways of doing it:
#sed -n 'H;${g;s/\n//;s//,/g;p}'
#sed -n '1h;1!H;${g;s/\n/,/g;p}'
sed ':b;N;$!bb;s/\n/,/g'
하지만 저는 Loïc의 paste
솔루션을 사용하기 시작할 것 같습니다.