열에 있는 수백 개의 숫자를 쉼표로 구분된 행으로 변환

열에 있는 수백 개의 숫자를 쉼표로 구분된 행으로 변환

열에서 다음을 어떻게 변환할 수 있습니까?

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
    

    -0777Perl에게 파일을 "후루룩 소리를 내며" 전체 파일을 메모리로 읽도록 지시합니다 . 그런 다음 모든 개행 문자를 쉼표로 바꾸고 마지막 쉼표를 개행 문자로 바꿉니다. 방법 -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솔루션을 사용하기 시작할 것 같습니다.

관련 정보