답변:
사용 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
.