여러 줄에 ID가 있는 다음과 같은 파일이 있지만 모든 레코드가 같은 줄에 있어야 합니다.
8600
22007
93509
9984
22146
도착하다8600,22007,93509,9984,22146
sed를 사용하여 vi에서 이 작업을 수행할 수 있더라도 1,$ s/\n/,/g
bash를 사용하여 이를 자동화해야 합니다.
나는 노력했지만 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