파일에서 데이터를 추출하고 하나의 열 값을 기준으로 다른 파일에 배치


14

아래 값을 가진 CSV 파일을 생성합니다

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9

두 번째 열을 기준으로 데이터를 추출하고 파일을 만들어야합니다. 577이면 전체 줄을 추출하여 별도의 파일에 배치해야합니다. 나는 두 번째 열이 577 인 줄과 두 번째 열이 132 인 줄이있는 파일이 필요하다는 것을 의미합니다.

IF를 사용해 보았지만 작동하지 않았습니다.


5
실제로 작동하지 않는 코드를 게시하는 것은 항상 좋은 생각입니다.
goldilocks

답변:


27

사용 awk:

awk -F, '{ print > $2 ".csv" }' file.csv

두 개의 파일 577.csv132.csv현재 디렉토리에 생성됩니다.

위의 명령은 당신 만이 할 수있는 가정 132또는 577두 번째 필드있다. 전체의 두 번째 필드에있는 각 값에 대해 하나의 파일 이름을 작성합니다 file.csv.

관심있는 두 값 이외의 다른 값이 있고 해당 행을 무시하려면 대신 다음을 수행하십시오.

awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv

1
awk사용할 수없는 버그 구현이 있습니다 print > $2 ".cvs". 이 경우 먼저 파일 이름을 계산 한 다음 print: 을 수행해야합니다 fname = $2 ".cvs"; print > fname.
Kusalananda

3

나는 terdon의 awk솔루션을 좋아 하지만 완전성을 위해 다음을 사용하는 제안이 있습니다.bash

while IFS=, read -r a1 a2 a3 a4; do 
    echo "$a1,$a2,$a3,$a4" >> "$a2".csv
done < file.csv

파일 577.csv132.csv현재 디렉토리에 파일을 생성합니다 .


3

모든 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솔루션이 더 포괄적 이라고 생각 합니다.


577이 다른 필드에 있거나 두 번째 필드가 아니거나 필드의 일부인 경우에도 일치합니다. 예를 들어 foo577bar또는 yp9012,132,8,577.
terdon

내 쉼표를 사용하면 필드 위치에 따라 다릅니다.
X Tian

죄송합니다. 잘못된 예가 있지만 .*쉼표와 일치 하여 일치하는 필드를 알 수 없습니다. 두 번째 일 수도 있고 45 일 수도 있습니다. 두 번째 불만이 잘못되었습니다 foo577bar. 쉼표가 일치하지 않도록 보호하는 것이 맞습니다 .
terdon

경우 어떻게해야합니까 | , 대신 문자가 사용됩니다.
user3116123

다음 grep 오류 수신 : 잘못된 옵션-e 사용법 : grep -hblcnsviw 패턴 파일. . .
user3116123

1

사용 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.