다음과 같은 CSV 파일이 있습니다.
1004051,[email protected],abc,eaf
1004052,[email protected],edf,eaf
1004053,[email protected],abc,eaf
1004054,[email protected],ghi,eaf
두 번째 필드가 string 으로 시작하는 행만 추출하고 싶습니다 abc_
.
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf
답변1
,
다시 한 번 이것이 첫 번째 필드에 s를 포함하는 것을 피하기 위해 구문 분석이 필요하지 않다고 가정하면 sed
다음을 수행할 수도 있습니다.
sed -nE "/[^,]+,abc/p" file
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf
-n
모든 줄을 인쇄하는 대신 확장 정규식을 사용하여 뒤에 E
가 포함되지 않은 시퀀스를 테스트 ,
하세요 . 그런 다음 일치하는 경우 에만 린트를 수행하십시오.[^,]+
,abc
p
답변2
$ awk -F, '$2 ~ /^abc_/' file.csv
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf
이는 awk
필드 구분 기호로 쉼표를 사용합니다. 두 번째 필드( $2
)가 text 로 시작하는지 테스트합니다 abc_
. 이는 정규식을 통해 수행됩니다 ^abc_
. 테스트가 성공하면 현재 줄이 인쇄됩니다.
입력 파일이 "단순 CSV" 파일이 아니고 쉼표와 줄바꿈이 포함된 인용 필드가 있는 CSV 파일인 경우 CSV 파서를 사용해야 합니다. 예를 들어 다음을 csvgrep
사용할 수 있습니다.csvkit
툴킷:
$ csvgrep -H -c 2 -r '^abc_' file.csv
a,b,c,d
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf
csvgrep
두 번째 열이 문자열로 시작하는 모든 레코드를 추출 하는 데 사용됩니다 abc_
. 출력의 첫 번째 줄은 csvgrep
입력 파일에 헤더 행이 포함되어 있지 않기 때문에 생성된 헤더 행입니다. 이를 원하지 않으면 결과를 전달하여 제거하십시오 sed 1d
.
$ csvgrep -H -c 2 -r '^abc_' file.csv | sed 1d
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf
당신은 또한 볼 수 있습니다 csvgrep --help
.
답변3
파이썬
#!/usr/bin/python
import re
d=re.compile(r'abc')
l=open('filename','r')
for m in l:
k=m.split(",")
if re.search(d,k[1]):
print m.strip()
산출
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf