기본 텍스트로 파이프로 구분된 값 파일의 빈 셀 채우기 [닫기]

기본 텍스트로 파이프로 구분된 값 파일의 빈 셀 채우기 [닫기]

빈 셀이 포함된 PSV 파일이 있습니다. 빈 셀을 값으로 채우고 싶습니다.00000000000

입력 예

0000000001|00346743139|201901|07
0000000002||201901|00

원하는 출력

0000000001|003467431|201901|07
0000000002|00000000000|201901|00

나는 사용해 보았습니다.

sed -i "s/||/|00000000000|/g" filename

답변1

귀하의 sed명령은 겹치지 않는 모든 문자열을 ||. |00000000000|적어도 제공된 데이터에 대해 이것이 어떻게 문제를 해결하지 못하는지 명확하지 않습니다.

% sed 's/||/|00000000000|/g' file.csv
0000000001|00346743139|201901|07
0000000002|00000000000|201901|00

예상 출력이 잘린 것 같습니다 00346743139( 003467431마지막 두 정수가 제거됨). 이것이 의도적인 것인지는 불분명합니다.

Unix에서 비표준 옵션을 사용하여 -i구현하는 데 문제가 있는 경우 sed게시물을 참조하세요.sed -i(제자리에서 편집)를 사용하여 이식성을 달성하는 방법은 무엇입니까?

예를 들어 macOS에서 명령을 실행하면 다음과 같습니다.

$ sed -i "s/||/|00000000000|/g" filename
sed: 1: "filename": invalid command code f

-i이 시스템에서는 옵션이 다르게 사용되기 때문입니다 . -i ''macOS에서 이 옵션을 사용하세요(그리고 시스템 man sed에서 이 옵션에 대해 읽어보세요).


보다 강력한 CSV 구문 분석을 위해 실제 CSV 구문 분석기를 사용할 수 있습니다.

사용csvkit 도구CSV 구문 분석을 수행하고 jq실제 처리를 수행합니다.

% csvjson -I -H file.csv | jq -r '.[] | map(select(. == null) |= "00000000000") | @csv' | csvformat -D '|'
0000000001|00346743139|201901|07
0000000002|00000000000|201901|00

먼저 .csv 파일을 사용하여 CSV 파일을 JSON으로 변환합니다 csvjson. 여기서 사용하는 옵션은 유형 추론을 끄고(숫자가 문자열로 해석되도록) CSV 데이터에 헤더 행이 없음을 유틸리티에 알립니다. 도구 는 데이터에 사용된 올바른 구분 기호를 csvjson자동으로 감지 하지만 이를 구분 기호로 사용 하도록 명시적으로 지시할 수도 있습니다 .||-d '|'

그런 다음 코드는 jq모든 null 값을 문자열로 바꾸고 00000000000처리된 데이터를 다시 CSV 형식으로 지정합니다.

파이프로 구분된 출력을 원하므로 출력 에 csvformat사용된 구분 기호를 - 문자로 변경합니다.@csvjq|

출력을 새 파일 이름으로 리디렉션하고 선택적으로 원본 데이터를 새 파일로 바꿉니다.

csvkit둘 다 jqmacOS에서 작동합니다.홈브루 패키지 관리자.

답변2

귀하의 sed명령은 좋아 보이고 귀하의 입력 예제로 시도해 보면 작동합니다.

그래도 파이프로 구분된 파일이나 일반 테이블 형식 값을 구문 분석하는 것에 대한 일반적인 대안으로 awk. "빈" 열을 00000000000. 이를 위해 다음을 사용할 수 있습니다.

awk 'BEGIN{FS=OFS="|"} {for (i=1;i<=NF;i++) {if ($i=="") $i="00000000000"}} 1' filename
  • 이는 먼저 입력 및 출력 awk에 대해 어떤 필드 구분자가 고려되는지 나타냅니다( 예는 입력 필드 구분자, 예는 출력 필드 구분자입니다.|FSOFS
  • 그런 다음 행의 모든 ​​필드(=열)를 반복하고 빈 필드를 찾으면 해당 값을 00000000000( " 현재 행의 필드 번호" $i를 참조하며 다음을 포함하는 자동 생성 변수)로 설정합니다. 필드 수).iNF
  • 1마지막으로, 가능한 수정 사항( 마지막에 지저분해 보이는 부분)을 포함하여 모든 줄을 인쇄합니다.

필드 번호에만 적용되도록 쉽게 제한할 수도 있습니다. 2. 다른 빈 열을 다르게 처리하려면 다음을 수행하십시오.

awk 'BEGIN{FS=OFS="|"} {if ($2=="") $2="00000000000"} 1' filename

관련 정보