답변:
사용 awk:
awk -F, '{ print > $2 ".csv" }' file.csv
두 개의 파일 577.csv과 132.csv현재 디렉토리에 생성됩니다.
위의 명령은 당신 만이 할 수있는 가정 132또는 577두 번째 필드있다. 전체의 두 번째 필드에있는 각 값에 대해 하나의 파일 이름을 작성합니다 file.csv.
관심있는 두 값 이외의 다른 값이 있고 해당 행을 무시하려면 대신 다음을 수행하십시오.
awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv
awk사용할 수없는 버그 구현이 있습니다 print > $2 ".cvs". 이 경우 먼저 파일 이름을 계산 한 다음 print: 을 수행해야합니다 fname = $2 ".cvs"; print > fname.
모든 577을 stdout으로 추출하려면
grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv
-편집 1 아래의 @terdon의 설명에 따라 577과 일치하는 쉼표가 3 개 이상일 때 잘못된 일치를 피하도록 수정되었습니다.
grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv
그러나 나는 그의 awk솔루션이 더 포괄적 이라고 생각 합니다.
foo577bar또는 yp9012,132,8,577.
.*쉼표와 일치 하여 일치하는 필드를 알 수 없습니다. 두 번째 일 수도 있고 45 일 수도 있습니다. 두 번째 불만이 잘못되었습니다 foo577bar. 쉼표가 일치하지 않도록 보호하는 것이 맞습니다 .
사용 csvkit:
$ csvgrep -c 2 -m 577 data.csv >output.csv
-c 2차종은 cvsgrep두 번째 열을 고려와 함께 -m 577우리는 문자열 일치하도록 요청할 577해당 열의를.
다음과 같이 작성됩니다 output.csv.
yp1234,577,1,3
yp5678,577,3,5
여러 문자열을 일치시키고 각 문자열의 파일에 출력을 쓰려면 다음을 수행하십시오.
for pattern in 577 132; do
csvgrep -c 2 -m "$pattern" data.csv >"output-$pattern.csv"
done
이 두 파일을 만듭니다 output-132.csv하고 output-577.csv.