헤더와 여러 열이 포함된 큰 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