텍스트 파일의 모든 줄을 한 줄로 결합하려면 어떻게합니까?


28

텍스트의 모든 줄을 한 줄로 가져 오려고합니다. 나는 코딩으로 배우려고 노력하는 초보자입니다. 이 문제를 해결하기 위해 4 시간을 보냈습니다. 이 문제에 대한 간단한 해결책이 있다는 것을 알고 있습니다. 여기 내가 시도한 것이 있습니다.

sed -e 'N; s / \ n //'myfile.txt # 아무것도하지 않습니다

sed -e : a -e N -e 's / \ n / /'-e ta myfile.txt # 출력이 엉망이고 구문의 머리 나 꼬리를 만들 수 없습니다

고양이 myfile.txt | tr -d '\ n'> myfile.txt # 모든 줄을 삭제

텍스트 파일은 다음과 같습니다.

500212
262578-4-4
23200
그리피스 실험실 LTD
그리피스 실험실
사우스 더블린 카운티 협의회
사무실
사무실 (기업)
평가 가능 목록
2 Pineview 산업 단지
Firhouse Road
녹 리온
2007 년 12 월 31 일
2008 년 1 월 1 일 "   

내가 어디로 잘못 갔는지 알 수 없습니다 ....

답변:


31

tr당신이 그것을 사용 한다 작동하고 간단합니다 - 당신은 단지에 필요한 다른 파일로 출력 . 입력 파일을 출력으로 사용하는 경우 결과는 관찰 한대로 빈 파일입니다.

고양이 myfile.txt | tr -d '\ n'> oneline.txt

일부 편집자는로 줄을 끝내는 것을 기억해야합니다 \r\n. 이 경우에는

cat myfile | tr -d '\r\n'

도움을 주셔서 감사하지만 여전히 작동하지 않습니다. 나는 그것이 기본적이고 단순하다고 생각합니다. 지정한 명령으로 모든 줄이 삭제되었습니다. 파일을 게시 할 것입니다 500212 262578-4-4 23200 GRIFFITH LABORATORIES LTD GRIFFITH LABORATORIES 사우스 더블린 카운티 협의회 사무실 (산업) 목록 평가 가능 2 Pineview Industrial Estate Firhouse Road Knocklyon 2007 년 1 월 31 일
John

@ 조 : 결과 또는 오류는 무엇입니까?
ish

답변을 수정하여 게시하려고했습니다. 명령을 사용한 후 파일이 비어있었습니다. 터미널 "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt"에서 다음과 같이 표시되었습니다. 다시 감사합니다.
John

@ 존 : 같은 출력 파일 이름을 사용할 수 없습니다! (답변 참조). 시도해보십시오cat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
더 좋은 방법은 tr -d '\n' <input.txt > output.txt고양이의 쓸모없는 사용을 피하고 불필요한 파이프를 덜 사용하는 것입니다.
evilsoup

8

여기있어. 또 다른 솔루션이며 간단합니다.

echo $(cat Input.txt) > Output.txt

2
나는 이것이
굉장히 훌륭하다는

echo `cat Input.txt` > Output.txt 또 다른
변형

단일 분할에 공백이 하나 이상 있으면 (공백, 탭, 줄 바꿈 등) 공백으로 대체됩니다.
iBug

이것은 좋은 해결책이지만 내 컴퓨터에서 솔루션보다 3 배나 오래 걸린다는 것을 알았습니다 tr.
LS

3

간단한 방법

awk를 사용하는 또 다른 방법은

cat myfile.txt | awk '{print}' ORS=''

산출:

500212262578-4-423200GRIFFITH LABORATORIES (주) 더블린 카운티 협의회 사무실 (기업) 목록 평가 가능 2 Pineview Industrial EstateFirhouse RoadKnocklyon 2007 년 12 월 31 일 2008 년 1 월 "

노트 :

ORS = '' -> 이것은 필드 구분자입니다. 작은 따옴표 사이에 문자를 필드 구분자로 사용할 수 있습니다. 이 awk 방법을 사용하여 공백과 모든 문자를 포함 할 수 있습니다.

이것이 도움이되기를 바랍니다!


1
ORS는 출력 레코드 구분자입니다. OFS는 출력 필드 구분자입니다. 참조 thegeekstuff.com/2010/01/...를 또는man awk
장로 긱

3

:a기본 명령어 외부에 레이블을 넣을 필요가 없으며 필요한 -e옵션도 없습니다. 마지막으로 /$/는 불필요합니다 (모든 라인에는 EOL 문자가 있습니다).

다른 답변을 개선하면

sed -i ':a; N; s/\n/ /; ta' file

다음과 같이 작성하면 더 명확합니다.

sed -i ':a
        N
        s/\n/ /
        ta' file

이 명령은 다음과 같이 작동합니다.

  1. N 현재 행이 이미 포함 된 (여러 줄) 패턴 공간에 다음 행을 추가합니다.
  2. s/\n/ /개행 문자를 대체 \n하여 생성 된 N공백을 ;
  3. ta:a 2 단계에서 대체가 성공한 경우 레이블 다음에있는 스크립트 행 으로 이동합니다 . , 대체가 발생한 경우 실행은 스크립트 끝을 "히트" 하지 않고 ( , 다른 입력 행을 읽지 않고) 1 단계로 이동합니다 .

다음에 유의하십시오.

  • sed입력 파일의 행을 첫 번째 행부터 하나씩 순서대로 읽습니다 .
  • :a 실행할 명령이 아닌 레이블 일뿐입니다.
  • N 원칙적으로 모든 라인에서 실행되지만
  • s/\n/ /(원칙적으로 모든 라인에서 실행 됨) 마지막 라인을 제외한 모든 라인에서 성공 하므로
  • ta마지막 입력 행을 읽을 때만 ( 스크립트가 끝날 수 있음) ( s실패한 유일한 행 )
  • 마지막 입력을 읽지 않는 한 첫 번째 입력을 읽은 후에는 추가 입력 행을 패턴 공간 으로 읽지 않지만 읽을 행이 더 이상없고 암시 적 명령이 실행됩니다.p

따라서 스크립트는 기본적으로 첫 번째 입력 을 읽고 줄 바꾸기를 공백으로 대체 할 때마다 다음 행을 하나씩 계속 추가합니다. 마지막 줄 이 추가 된 후 ( \n공백으로 변경됨), N줄을 추가 할 수없고, s실패하고, ta건너 뛰고, 스크립트의 끝에 도달하고, 암시 된 print 문이 현재의 긴 1 행 패턴 공간에서 실행됩니다. .

-i옵션은 입력 파일 file을 전체 1 행 패턴 공간으로 대체합니다 .


2

편집 :

검색하고 \n공백 ''으로 바꾸십시오 .
'검색'-> '바꾸기'로 이동
하거나 키보드 단축키 Ctrl+H

아래 스크린 샷을 참조하십시오 :

원본 텍스트는 1-14 행에 있습니다.
결과는 16 행입니다.

여기에 이미지 설명을 입력하십시오




0

sed에게 yourfile.txt의 출력을 원하는 결과 newfile.txt로 리디렉션하도록 지시해야한다는 것을 잊어 버린 것 같습니다. 이것은 당신이 필요로하는 명령 것으로 보인다,하지만 당신은 병합하려고하는 파일의 나오지 버퍼에 비해 너무 큰 아닌 경우에만 : sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt. sed의 기능에 대해 토론 하는 다른 포럼에 참여하십시오 . 나는 명령을 테스트했고 그것은 나를 위해 일했다.


1
실제로 스위치 와 함께 sed-i 는 원본 파일을 인라인으로 수정 하므로 다른 파일로 출력 할 필요가 없습니다. 그래도 조심하세요!
ish

나는 sed -e : a -e N -e 's / \ n / /'-e ta reval_details.asp? Pno = 500214.txt를 시도했다. 2008 년 1 월 1 일 산업 단지 sed -i : a -e N -e 's / \ n / / '-e ta reval_details.asp? Pno = 500214.txt sed : a'sed로 이동하기위한 레이블을 찾을 수 없습니다 a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to -e : a -e N -i 's / \ n / /'-e ta reval_details .asp? Pno = 500214.txt sed : s / \ n / /를 읽을 수 없습니다 : 해당 파일이나 디렉토리가 없습니다.
John

@Mik 아직 운이 없었지만 답장을 보내 주셔서 감사합니다.
John

텍스트를 텍스트 편집기에 복사하여 붙여 넣은 다음 파일을 저장 한 다음 내 sed 명령을 사용하여 nano로 열 때 한 줄에 모두 표시되었습니다. 그러나 터미널에서 cat을 사용하여 파일을 열면 파일이 줄 바꿈되지 않고 한 줄로 표시되지 않으므로 아마도 그 일이 벌어지고 있습니다. 또한 sed 전에 a '가 필요하지 않으며 위의 명령에 다른 불필요한 요소를 추가했다고 생각합니다 .sed -e : a -e N -e's / \ n / / '-e ta yourfile.txt> newfile.txt 줄이 너무 길어서 30 인치 이상의 모니터가 없으면 화면에 줄 바꿈되어 표시됩니다!

@Mik은 게시물을 건배합니다. 텍스트 편집기에 내 데이터를 입력하여 저장하고 'sed -e : a -e N -e's / \ n / / '-e ta abc.txt> abc1.txt'를 실행했으며 작동했습니다. 아주. 할렐루야. 그런 다음 'sed -e : a -e N -e's / \ n / / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt'를 입력하고 첫 줄을 제외한 모든 줄에는 줄의 시작 부분에 공백이 추가되었습니다. 귀하의 노력에 감사 드리지만 옥타브로 넘어 가서 데이터를 처리하려고합니다.
John

0

순수한 배쉬 솔루션 :

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt

0

그것이 나이라면 vim에서 열고 Shift+ J를 몇 번 누르십시오 .


0
vim <your_file>

vim 내에 입력하고 Enter를 누르십시오.

:% s/\n/ /g

0

파이썬 접근법 :

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

AWK :

awk '{printf "%s ",$0}' /etc/passwd  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.