Bash에서 개행 문자를 다른 문자로 변경

Bash에서 개행 문자를 다른 문자로 변경

여러 줄에 ID가 있는 다음과 같은 파일이 있지만 모든 레코드가 같은 줄에 있어야 합니다.

8600
22007
93509
9984
22146

도착하다8600,22007,93509,9984,22146

sed를 사용하여 vi에서 이 작업을 수행할 수 있더라도 1,$ s/\n/,/gbash를 사용하여 이를 자동화해야 합니다.

나는 노력했지만 sed -i 's/\n/,/g' filename운이 없었다. 어떤 아이디어가 있나요?

답변1

단일 paste명령을 사용하십시오.

paste -d, -s infile

-s명령 인쇄 라인 만들기에스일련번호는 -d,쉼표로 구분됩니다.

답변2

당신은 그것을 사용할 수 있습니다tr

tr '\n' ,

이것은 바뀔 것이다모든인스턴스가 \n쉼표로 변경되었으므로 마지막 인스턴스를 수정해야 합니다. 이것은 예이다

cat >file.txt <<x
8600
22007
93509
9984
22146
x

tr '\n' , <file.txt
8600,22007,93509,9984,22146,        # and the shell prompt follows immediately

tr '\n' , <file.txt | sed 's/,$/\n/'
8600,22007,93509,9984,22146         # line is ended with newline

이 사용법은 sed모든 줄이 개행 문자로 끝날 것으로 예상하는 POSIX에 의해 정의되지 않습니다. POSIX는 마지막 줄에 줄 끝이 없을 때 후행 개행 추가를 명확하게 정의하므로 awk 1파이프를 삽입하여 이 문제를 해결할 수 있습니다 .awk

tr '\n' , <file.txt | awk 1 | sed 's/,$//'
8600,22007,93509,9984,22146         # line is ended with newline

빠른 수정을 위해 이는 허용됩니다(물론 paste다른 곳에서 더 나은 솔루션을 사용할 수 있음). 그러나 tr | awk | sed이는 보기 흉한 조합이므로 프로덕션 코드에서 다시 검토해야 합니다. 그래서 우리는 다음과 같이 끝날 수 있습니다:

awk 'NR>1 {printf ","}; {printf "%s", $0}; END {printf "\n"}' file.txt

답변3

GNU를 사용 하고 환경에 변수가 sed없다고 가정합니다 . 또는 변수가 있는 경우 입력 길이는 최소 두 줄입니다.POSIXLY_CORRECT

sed ':a;N;$!ba;s/\n/,/g' input.txt

개행 문자를 대체할 수 없습니다.. 하지만 위의 모든 줄을 추가하면 가능합니다.

답변4

방법 1:

perl -pe 's/\n/,/ unless eof' filename

산출

8600,22007,93509,9984,22146

방법 2(Python 사용)

#!/usr/bin/python
m=open('file.txt','r')
j=[]
for i in m:
    j.append(i.strip())
print ",".join(j)

산출

python i.py 
8600,22007,93509,9984,22146

관련 정보