BASH의 마지막 행의 CSV 열에서 빈 문자열을 읽습니다.

BASH의 마지막 행의 CSV 열에서 빈 문자열을 읽습니다.

gawkcsv 파일 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때문입니다 .\nxcol

옳은:

$ 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$

이 문제에 대해 자세히 알아보려면 다음에서 "명령 대체"를 확인하세요.

  1. POSIX 표준쉘 실행 환경 부분그것은 말한다:

쉘은 하위 쉘 환경(쉘 실행 환경 참조)에서 명령을 실행하고 명령 대체(명령 텍스트 + "$()" 또는 백틱)를 명령의 표준 출력으로 대체하여 명령 대체를 확장해야 합니다. 여러 문자의 시퀀스입니다.

  1. https://mywiki.wooledge.org/CommandSubstitution문제에 대해 더 자세히 설명하고 위에서 사용한 해결 방법을 제공합니다.

관련 정보