
다음과 같은 큰 csv 파일(Test.csv)이 있습니다.
1,2,3,A,5
1,2,3,B,5
1,2,3,E,5
1,2,3,D,5
1,2,3,Z,5
1,2,3,B,5
4번째 열의 내용이 다른 파일에 있는 줄을 인쇄하고 싶습니다. 실제로는 4번째 열 콘텐츠라는 이름의 새 csv 또는 txt 파일에 동일한 콘텐츠가 있는 이 줄을 결합해야 합니다. 예를 들어:
산출:
파일 A
1,2,3,A,5
1,2,3,A,5
1,2,3,A,5
파일 B
1,2,3,B,5
1,2,3,B,5
입력 파일이 크기 때문에 이 4번째 열에 얼마나 많은 패턴이 있는지 알 수 없습니다. 4열에는 단어만 포함되고 다른 열에는 단어 및/또는 숫자가 포함됩니다.
경험이 없기 때문에 비슷한 질문을 조사하고 다음 코드도 시도했습니다.
awk 'NR==FNR{a[$4]=NR; next} $NF in a {print > "outfile" a[$NF]}' Test.csv
하지만 아무것도 효과가 없었습니다. 누구든지 저를 도와주실 수 있나요? 미리 감사드립니다.
답변1
이는 모든 UNIX 상자의 모든 쉘에서 POSIX 정렬 및 awk를 사용하여 효율적으로 작동합니다.
$ sort -t, -k4,4 test.csv |
awk -F, '$4!=prev{close(out); out="File"$4; prev=$4} {print > out}'
$ head -n 20 File*
==> FileA <==
1,2,3,A,5
==> FileB <==
1,2,3,B,5
1,2,3,B,5
==> FileD <==
1,2,3,D,5
==> FileE <==
1,2,3,E,5
==> FileZ <==
1,2,3,Z,5
참고할 사항:
- 일부 awks는 출력 리디렉션 오른쪽에 있는 표현식 주위에 괄호를 넣어야 하며,
- 일부 awk는 출력 파일을 닫지 않고 12개 정도의 출력 파일을 지나면 너무 많은 열린 파일을 유지하려고 시도하면 실패합니다.
- 여러 개의 열린 출력 파일을 유지하는 것은 이를 허용하는 모든 awks에서 매우 비효율적입니다.
- 이를 설명하기 위해 출력 파일을 한 줄씩 닫는 것은 모든 awks에서 매우 비효율적입니다.
답변2
출력 파일 이름의 필드만 사용할 수 있어야 합니다. 간단한 솔루션:
awk -F, '{print > ("file_" $4 ".csv")}' Test.csv
이는 최소한 GNU awk에서 작동 하고 file_A.csv
.file_B.csv
-F,
필드 구분 기호를 쉼표로 설정합니다.
당신이 보여준 스크립트가 무엇을 해야 하는지 잘 모르겠습니다.
답변3
이 같은:
$ awk -F, '{ print $0 >> "file-" $4 ".txt"; }' ./tmp.txt
@ilkkachu의 답변에서 언급했듯이 플래그는 -F
필드 구분 기호를 기본 공백 문자에서 쉼표로 변경하는 것입니다. 파일이 존재하는 경우 덮어쓰지 않도록 >>
대신 사용해야 합니다 .>
답변4
파이썬
#!/usr/bin/python
uni=[]
k=open('file.txt','r')
for i in k:
g=i.split(",")[3].strip()
if g not in uni:
uni.append(g)
for m in uni:
f=open("{0}.txt".format(m),'w')
l=open('file.txt','r')
for d in l:
if m in d.split(",")[3].strip():
f.write(d)
이미 awk에서 제공되는 최고의 솔루션은 내 시도에 불과합니다.
for i in `awk -F "," '{if(!seen[$4]++)print $4}' file.txt`; do awk -v i="$i" -F "," '$4==i{print $0}' file.txt >$i.txt; done