텍스트 처리 - 두 줄마다 쉼표로 연결

텍스트 처리 - 두 줄마다 쉼표로 연결

내 파일 중 하나에 1000줄이 넘는 줄이 있습니다. 파일은 다음과 같이 시작됩니다(줄 번호 추가).

Station Name
Station Code
A N DEV NAGAR
ACND
ABHAIPUR
AHA
ABOHAR
ABS
ABU ROAD
ABR

두 줄마다 쉼표로 구분된 항목을 연결하여 이를 파일로 변환해야 합니다. 최종 데이터는 다음과 같아야합니다

Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR
...

내가 시도하는 것은 쉘 스크립트를 작성하고 echo그 사이에 쉼표를 사용하는 것입니다. 하지만 / 에 있는 더 간단하고 효율적인 한 줄 문이 sed여기서는 해당 작업을 수행 할 수 있을 것 같습니다 awk.

어떤 아이디어가 있나요?

답변1

cat(고양이를 좋아한다면 ;-)) 및 다음을 사용하세요 paste.

cat file.in | paste -d, - - > file.out

지침: paste여러 파일에서 읽고 해당 줄을 함께 붙여넣습니다(첫 번째 파일의 줄 1과 두 번째 파일의 줄 1 등).

paste file1 file2 ...

-파일 이름 대신 (대시)를 사용할 수 있습니다. pastefile1(즉, 표준 입력)에서 첫 번째 줄을 가져옵니다. 그런 다음 file2(또한 표준 입력)에서 첫 번째 줄을 읽으려고 합니다. 그러나 stdin의 첫 번째 줄을 읽고 처리했으므로 현재 입력 스트림에서 대기 중인 내용은 다음과 같습니다.두번째stdin 라인에서는 paste행복하게 첫 번째 라인을 고수합니다. 이 -d옵션은 구분 기호를 탭 대신 쉼표로 설정합니다.

아니면

cat file.in | sed "N;s/\n/,/" > file.out

PS 예, 위 내용은 다음과 같이 단순화할 수 있습니다.

< file.in sed "N;s/\n/,/" > file.out

또는

< file.in paste -d, - - > file.out

장점은 사용되지 않는다는 것입니다 cat.

하지만 나는 이 관용어를 사용한 적이 없다.고의로, 명확성을 위해 - 너무 장황하지 않아서 제가 좋아합니다 cat(고양이는 좋습니다). 그러니 편집하지 마세요.

또는 "cat" 대신 "paste"를 사용하려는 경우("paste"는 파일을 수평으로 결합하는 명령이고 "cat"은 파일을 수직으로 결합하는 명령입니다) 다음을 사용할 수 있습니다.

paste file.in | paste -d, - -

답변2

누구든지 여기에 와서 모든 행을 단일 CSV 행으로 병합하고 싶다면 시도해 보십시오.

cat file | tr '\n' ','

답변3

sed 'N;s/\n/,/' file

sed를 사용하여 2줄마다 조인(N)하고 개행 문자(\n)를 ","로 바꿉니다.

답변4

paste -sd ',\n' file.in > file.out

또한 한 문자를 다른 문자로 바꾸는 것이므로(다른 모든 줄 바꿈은 쉼표로) 입력 파일을 그 자리에서 처리할 수 있습니다.

paste -sd ',\n' file.in 1<> file.in

(그러나 CRLF 종결자(예: Microsoft의 종결자)가 있는 비 Unix 시스템에서는 실행되지 않을 수 있으며 일부 에뮬레이트된 POSIX는 paste비 Unix 방식으로 이를 처리할 수 있습니다.)

관련 정보