gawk
csv 파일 file.csv의 첫 번째 열에서 값을 읽으려면 다음 스크립트를 사용하고 있습니다 . 포함된 쉼표를 무시하고 싶지 않기 때문에
사용합니다 .gawk
col=`gawk '
BEGIN {
FPAT="([^,]*)|(\"[^\"]*\")+"
}
{print $1 }' file.csv`
그러나 빈 문자열/공백이 마지막 줄에 있으면 이 메서드는 이를 무시한다는 것을 알았습니다.
예를 들어 file.csv가 다음과 같은 경우:
col1,col2
"a,a","a,a1"
"b","b1"
,"c1"
결과는 다음과 같습니다
col1
a,a
b
바꾸다
col1
a,a
b
이 문제를 해결하려면 어떻게 해야 합니까?
감사합니다!
관련 게시물:BASH의 CSV 파일에서 빈 문자열 읽기
답변1
아래 댓글에서도 언급했듯이이전 질문, 이는 CSV 또는 awk 스크립트와 관련이 없으며 명령 출력을 저장하는 방법과 관련이 있습니다.
$ printf 'a\nb\n\n'
a
b
$ col=$(printf 'a\nb\n\n')
$ printf '%s' "$col"
a
b$
$ col=$(printf 'a\nb\n\n'; printf x)
$ printf '%s' "$col"
a
b
x$
$ col="${col%x}"
$ printf '%s' "$col"
a
b
$
위와 같이하면 얻을 수 있습니다.모두명령 대체가 제거되는 최종 개행 문자를 포함하여 변수에 저장된 명령의 출력입니다. 마지막 개행 문자도 제거하려면 다음을 수행하십시오.
$ col="${col%$'\n'}"
$ echo "$col"
a
b
$ printf '%s' "$col"
a
b
$
x
\n
단일 단계를 수행하는 대신 두 단계로 합계를 제거하는 이유는 명령이 출력을 생성하지 않거나 출력이 a 로 끝나지 않으면 다음 항목에 존재하지 않기 때문에 col="$(col%$'\n'x}"
작업이 실패하기 \n
때문입니다 .\nx
col
옳은:
$ col=$(printf 'a'; printf x)
$ col="${col%x}"
$ col="${col%$'\n'}"
$ printf '%s' "$col"
a$
잘못된:
$ col=$(printf 'a'; printf x)
$ col="${col%$'\n'x}"
$ printf '%s' "$col"
ax$
이 문제에 대해 자세히 알아보려면 다음에서 "명령 대체"를 확인하세요.
- POSIX 표준쉘 실행 환경 부분그것은 말한다:
쉘은 하위 쉘 환경(쉘 실행 환경 참조)에서 명령을 실행하고 명령 대체(명령 텍스트 + "$()" 또는 백틱)를 명령의 표준 출력으로 대체하여 명령 대체를 확장해야 합니다. 여러 문자의 시퀀스입니다.
- https://mywiki.wooledge.org/CommandSubstitution문제에 대해 더 자세히 설명하고 위에서 사용한 해결 방법을 제공합니다.