CSV는 새 열을 만들고 공백을 제거합니다.

CSV는 새 열을 만들고 공백을 제거합니다.

여러 열이 포함된 큰 CSV 파일이 있습니다. 첫 번째 열의 공백을 제거하고 새 열로 만들고 싶습니다.

예...

입력하다:

a b,xyz,d e f    
a b c,xyz,d e f    
a b c d,xyz,d e f   

산출:

ab,a b,xyz,d e f   
abc,a b c,xyz,d e f   
abcd,a b c d,xyz,d e f    

답변1

사용sed:

sed 'h;s/,.*/,/;s/ //g;G;s/\n//' data.csv

설명하다:

h - stash current line to the hold space
s/,.*/,/ - remove everything after the first comma
s/ //g - remove spaces
G - append the line from the hold space back to the pattern space
s/\n// - remove extra newline, as left by G

답변2

bash표준 도구와 함께 사용:

$ paste -d ',' <( cut -d ',' -f 1 file | tr -d ' ' ) file
ab,a b,xyz,d e f
abc,a b c,xyz,d e f
abcd,a b c d,xyz,d e f

paste주어진 두 파일의 입력을 쉼표로 구분하여 결합합니다.

첫 번째 파일은 파일의 첫 번째 쉼표로 구분된 열을 추출하고 공백을 제거하는 프로세스 대체에 의해 생성됩니다.

두 번째 파일은 수정되지 않은 원본 파일입니다.

답변3

bash단일 파일 솔루션이 있다고 가정해 보겠습니다 test.txt.

#!/bin/bash

while read -r line; do
   IFS=',' read -ra fields <<<"$line"
   (IFS=','; echo "${fields[0]//\ /},${fields[*]}")
done <"test.txt"

exit

이는 다음을 활용합니다.IFScsv 값을 배열로 읽어서 출력합니다. 의 각 줄을 test.txt문자열로 읽은 다음 해당 줄을 쉼표로 구분된 배열로 읽습니다. 공백을 제거하고 이 배열의 첫 번째 요소를 인쇄한 다음 전체 배열을 인쇄합니다. 인용된 배열을 사용하면 이전에 쉼표로 설정한 *로 구분된 요소가 출력됩니다 . 명령문 및 하위 쉘 내의 인라인 선언은 스크립트 IFS실행 의 나머지 부분에 대한 값을 유지합니다 .IFSread()IFS

답변4

훌륭하게밀러예:

mlr --csv --implicit-csv-header --headerless-csv-output \ put '$newField=gsub($1," +","")' \ then reorder -f newField input.csv

$1첫 번째 필드입니다. 정규식 검색을 적용하고 대체하여 새 필드를 얻습니다.

관련 정보