1000개의 행과 10개의 열을 포함하는 CSV 데이터 세트 Student.csv가 있습니다.
샘플 데이터는 다음과 같습니다.
s_id,s_name,s_dob,s_class,s_marks,s_parentname,
1,abc,1/1/18,5,49,def,
2,xyz,1/1/17,4,85,abc,
3,pqr,1/2/18,2,78,mnp,
이 데이터 세트에서 행에 "abc"가 포함된 모든 날짜를 텍스트 파일로 복사하고 싶습니다.
예상 출력:
text.txt
1/1/18
1/1/17
답변1
grep abc student.csv | cut -d, -f 3 >text.txt
이렇게 하면 먼저 어디에서든 student.csv
하위 문자열이 포함된 모든 행을 추출한 abc
다음 해당 행에서 세 번째 쉼표로 구분된 열을 제거하고 에 저장합니다 text.txt
.
질문에 제공된 데이터를 기반으로 text.txt
궁극적으로 다음을 포함하게 됩니다.
1/1/18
1/1/17
이는 원본 파일에 따라 달라집니다.단순한CSV 파일, 즉 쉼표나 줄 바꿈이 포함된 필드가 없습니다.
검색하고 싶은 abc
항목완전한 단어grep -w abc
대신에 just를 사용하세요 grep abc
. 이렇게 하면 와 같은 문자열이 포함된 행의 일치는 방지되지만 abcde
포함된 필드와는 여전히 일치합니다 abc xyz
.
임의의 복잡한 문자열(여전히 간단한 CSV 파일에 있음)이 포함된 필드를 찾고 필드가 해당 문자열과 정확히 동일해야 하는 경우 각 행의 필드를 반복해야 합니다.
string='some string' awk -F, '{ for (i = 1; i <= NF; ++i) if ($i == ENVIRON["string"]) { print $3 ; next } }' student.csv
이 awk
코드는 각 줄의 모든 필드를 반복하여 값이 환경 변수의 값과 정확히 동일한 쉼표로 구분된 필드를 찾습니다 string
. 해당 필드가 발견되면 세 번째 필드가 인쇄됩니다.
답변2
밀러 사용(https://github.com/johnkerl/miller)부터 시작
s_id,s_name,s_dob,s_class,s_marks,s_parentname,
1,abc,1/1/18,5,49,def,
2,xyz,1/1/17,4,85,abc,
3,pqr,1/2/18,2,78,mnp,
그리고 달리는 중
mlr --nidx --fs "," filter -S '$2=="abc"' then cut -f 3 input.txt >output.txt
당신은 할 것
1/1/18
답변3
전체 게임이 필요하다는 점을 고려하면 다음과 같습니다.
$ awk -F, 'FNR==1{print FILENAME} /(^|,)abc(,|$)/{print $3}' file
file
1/1/18
1/1/17
또는 abc
문자 그대로 처리하려는 RE 메타 문자가 실제로 포함되어 있을 수 있으므로 정규식 일치 대신 문자열을 수행해야 합니다.
$ awk -F, 'FNR==1{print FILENAME} index(","$0",",",abc,"){print $3}' file
file
1/1/18
1/1/17
또는 열 헤더를 인쇄합니다.
$ awk -F, 'FNR==1{print $3} /(^|,)abc(,|$)/{print $3}' file
s_dob
1/1/18
1/1/17
$ awk -F, 'FNR==1{print $3} index(","$0",",",abc,"){print $3}' file
s_dob
1/1/18
1/1/17