내 파일 중 하나에 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 ...
-
파일 이름 대신 (대시)를 사용할 수 있습니다. paste
file1(즉, 표준 입력)에서 첫 번째 줄을 가져옵니다. 그런 다음 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 방식으로 이를 처리할 수 있습니다.)