awk 주어진 열에서 동일한 내용을 가진 모든 줄을 다른 파일로 분리하는 방법

awk 주어진 열에서 동일한 내용을 가진 모든 줄을 다른 파일로 분리하는 방법

다음과 같은 큰 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

참고할 사항:

  1. 일부 awks는 출력 리디렉션 오른쪽에 있는 표현식 주위에 괄호를 넣어야 하며,
  2. 일부 awk는 출력 파일을 닫지 않고 12개 정도의 출력 파일을 지나면 너무 많은 열린 파일을 유지하려고 시도하면 실패합니다.
  3. 여러 개의 열린 출력 파일을 유지하는 것은 이를 허용하는 모든 awks에서 매우 비효율적입니다.
  4. 이를 설명하기 위해 출력 파일을 한 줄씩 닫는 것은 모든 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

관련 정보