여러 열이 포함된 큰 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
실행 의 나머지 부분에 대한 값을 유지합니다 .IFS
read
()
IFS
답변4
훌륭하게밀러예:
mlr --csv --implicit-csv-header --headerless-csv-output \ put '$newField=gsub($1," +","")' \ then reorder -f newField input.csv
$1
첫 번째 필드입니다. 정규식 검색을 적용하고 대체하여 새 필드를 얻습니다.