CSV 파일을 구문 분석하는 방법
파일 이름: abc.csv(csv 파일) 위 파일에는 다음 데이터가 포함되어 있습니다.
abv,sfs,,hju,',',jkk
wff,fst,,rgr,',',rgr
ere,edf,erg,',',rgr,rgr
다른 필드를 추출하여 다른 변수에 할당해야 하는 것과 같은 요구 사항이 있습니다.
내 코드:
cat $file | awk 'NR!=1' | while read -r line
do
a=`echo "$line" | awk -F',' '{print $1}'`
b=`echo "$line" | awk -F',' '{print $2}'`
c=`echo "$line" | awk -F',' '{print $3}'`
d=`echo "$line" | awk -F',' '{print $4}'`
e=`echo "$line" | awk -F',' '{print $5}'`
f=`echo "$line" | awk -F',' '{print $6}'`
echo "$e"
echo "$f"
done
출력: (작은따옴표로 출력을 제공합니다)
'
'
'
'
'
'
원하는 출력은 다음과 같아야 합니다. (내 다섯 번째 필드의 값은 "comma"입니다.)
,
jkk
,
rgr
,
rgr
rgr
답변1
cvscut
다음에서 사용csvkit
공구 상자:
$ csvcut -q "'" -c 5,6 file.csv
",",jkk
",",rgr
rgr,rgr
데이터에 비표준 인용 문자(작은따옴표)가 사용되었음을 -q "'"
알려야 합니다 . 다섯 번째와 여섯 번째 열을 csvcut
추출합니다 . -c 5,6
출력은 올바른 형식의 CSV 문서입니다.
따옴표를 추가하지 않고 다섯 번째 열만 얻으려면 다음을 수행하십시오.
$ csvcut -q "'" -c 5 file.csv | csvformat -T
,
,
rgr
csvcut
이는 through의 출력을 전달하며 csvformat
출력 구분 기호로 쉼표 대신 탭을 사용해야 합니다. 데이터에 탭 문자가 없으므로 데이터를 인용할 필요가 없습니다.
이는 탭으로 구분된 형식으로 여러 열을 가져오는 데에도 효과적입니다.
$ csvcut -q "'" -c 5,6 file.csv | csvformat -T
, jkk
, rgr
rgr rgr
또한 쉼표로 구분된 모든 데이터를 탭으로 구분된 데이터로 변환하는 데에도 작동합니다.
$ csvformat -q "'" -T file.csv
abv sfs hju , jkk
wff fst rgr , rgr
ere edf erg , rgr rgr
탭으로 구분된 데이터를 사용하면 표준 Unix 도구를 사용하여 데이터를 더 쉽게 처리할 수 있습니다.
$ csvformat -q "'" -T file.csv | cut -f 5,6
, jkk
, rgr
rgr rgr
다음은 예상되는 출력을 재현합니다.
$ csvformat -q "'" -T file.csv | awk -F '\t' '{ print $5; print $6 }'
,
jkk
,
rgr
rgr
rgr
(질문의 예상 출력에 예상치 못한 쉼표가 있습니다. 해당 열에서 나온 것으로 가정합니다.4개마지막 줄에. 거기 있어서는 안됩니다. )
고급 구문 분석을 위해서는 Python 또는 Perl과 같은 다른 스크립팅 언어를 고려하십시오.
Perl의 모듈은 Text::CVS
CSV 데이터에 대한 쉬운 액세스를 제공합니다. 다음은 Perl에서 전체 파일을 배열 배열로 읽는 것이 매우 쉽다는 것을 보여줍니다.
$ perl -MData::Dumper -MText::CSV=csv -e '$c = csv(in=>"file.csv",quote_char=>"\x27");print Dumper($c)'
$VAR1 = [
[
'abv',
'sfs',
'',
'hju',
',',
'jkk'
],
[
'wff',
'fst',
'',
'rgr',
',',
'rgr'
],
[
'ere',
'edf',
'erg',
',',
'rgr',
'rgr'
]
];
답변2
밀러와 함께
<input sed "s/'/\"/g" | mlr --c2x --implicit-csv-header cut -f 5,6 | \
grep -v "^$" | cut -d " " -f 2
당신을 위한
,
jkk
,
rgr
rgr
rgr
그것은 awk가 아닙니다. Miller의 훌륭한 구조화된 텍스트 도구입니다(http://johnkerl.org/miller/doc/).