새 파일에 줄 추출

새 파일에 줄 추출

헤더와 여러 열이 포함된 큰 CSV 파일이 있다고 가정해 보겠습니다. 이 질문의 목적을 위해 단 두 개의 열만 있는 작은 파일을 고려해 보겠습니다. 우리는 이것을 이렇게 부를 수 있습니다 use_rep.

user_id,rep
885,500K+
22565,200K+
7453,200K+
86440,100K+
116858,100K+
22222,100K+
38906,100K+
10762,<100K
70524,<100K

각 행을 두 번째 열의 값에 해당하는 파일로 보내고 싶습니다. 예를 들어, 다음과 같은 이름 200K+과 내용이 포함된 파일을 갖고 싶습니다.

user_id,rep
22565,200K+
7453,200K+

use_rep어떤 경우에도 콘텐츠가 주문되었다고 가정해서는 안 됩니다. 이상적으로는 사용하려는 패턴이 정규식을 허용합니다.

sed나 perl은 선호되지 않습니다.

답변1

헤더를 무시합니다(나중에 추가할 수 있음).

awk -F, 'NR > 1 {print > $2}' use_rep

두 번째 열의 이름이 지정된 파일에 각 줄을 인쇄합니다.

~ head *[0-9]*
==> 100K+ <==
86440,100K+
116858,100K+
22222,100K+
38906,100K+

==> 200K+ <==
22565,200K+
7453,200K+

==> 500K+ <==
885,500K+

==> <100K <==
10762,<100K

제목을 지정하려면 다음과 같이 보일 수 있습니다.

awk -F, 'NR == 1 {header = $0; next} # save header, skip this line
  !a[$2]++ { print header > $2 } # print if second field hasnt been seen before 
  { print > $2 }' use_rep

결과:

~ head *[0-9]*
==> 100K+ <==
user_id,rep
86440,100K+
116858,100K+
22222,100K+
38906,100K+

==> 200K+ <==
user_id,rep
22565,200K+
7453,200K+

==> 500K+ <==
user_id,rep
885,500K+

==> <100K <==
user_id,rep
10762,<100K
70524,<100K

답변2

다음 명령을 사용해보십시오. 훌륭하게 작동합니다.

주문하다

for i in `awk -F "," '{print $2}' l.txt | sort | uniq`; do sed -n '/'$i'$/p' l.txt > $i.txt ; done

관련 정보