Powershell ½ºÅ©¸³Æ® ¼öÁ¤ Á» µµ¿ÍÁÖ¼¼¿ä (ÅýºÆ® Áߺ¹ üũ)

dateno1   
   Á¶È¸ 1365   Ãßõ 0    

쪽팔리면 질문하지 맙시다. 소중한 답변 댓글을 삭제하는건 부끄러운 일 입니다 

Get-Content "./text.txt" | Group-Object | Where-Object { $_.Count -gt 1 } | Select -ExpandProperty Name


현제 내용은 이거 1줄이 끝입니다 (text.txt를 열어서 중복 라인을 체크후 표시해줍니다)


굳이 ps1 포맷을 안 쓰고, Python같은걸로 처리해도 상관 없습니다 (아니면 달성 가능한 소프트를 소개해주셔도 됩니다)


목표는 2가지입니다 (둘중 하나 달성 가능하면 됩니다)

1. 현제 구조면 싱글 스레드로 처리하다보니 수십만 (현제 40만대인데 차후 더 늘어날 수 있습니다) 라인 처리에 너무 오래 걸립니다


가능하다면 분할해서 4~6스레드정도로 처리하고 싶습니다 (전체 라인을 카운터해서 필요한 스레드 숫자로 나눈후 시작 지점을 각각 그만큼 더해서 지정하면 될꺼같습니다)


2. 진척도 표시및 이어서 처리 기능을 추가하고 싶습니다


현제 구조면 완료까지 아무것도 안 뜨고, 1~끝까지 처리인데 현제 처리중인 라인의 수치를 표시 + 실행시 시작과 끝을 입력하면 해당 구간을 처리하고, 안 하면 처음~끝까지 처리하게 하고자 합니다


만일 이게 가능해지면 여러개 실행해서 라인을 지정해서 실행하면 멀티 스레드로 처리가 가능하므로 1번이 필요 없어집니다


결국 2가지라 적었지만, 궁극적으로는 멀티 스레드로 처리하는게 목표라 보시면 됩니다 (싱글 스레드로 41.5만 라인 택스트 처리하니 끔찍한 시간이 걸립니다)

맨날 삽질만 하고 삽니다

http://www.2cpu.co.kr/hardware_2014/44147
컴 케이스 작다고 불타거나 하지 않아요

ªÀº±Û Àϼö·Ï ½ÅÁßÇÏ°Ô.
ChatGPT 3.5 ·Î µ¹¸°°Çµ¥, ¾Æ¸¶ Á¤È®È÷ Çѹø¿¡ ³ª¿ÀÁø ¾Ê¾ÒÀ»°Í °°½À´Ï´Ù. Á»´õ ´ÙµëÀ¸½Ã¸é ¿øÇϽô ½ºÅ©¸³Æ®°¡ ³ª¿ÀÁö ¾ÊÀ»±î¿ä?

GPT ÁúÀÇ)
Get-Content "./text.txt" | Group-Object | Where-Object { $_.Count -gt 1 } | Select -ExpandProperty Name
1. Àüü ¶óÀÎÀ» ºÐÇÒÇؼ­ 4~6½º·¹µåÁ¤µµ·Î ó¸® (Àüü ¶óÀÎÀ» Ä«¿îÅÍÇؼ­ ÇÊ¿äÇÑ ½º·¹µå ¼ýÀÚ·Î ³ª´«ÈÄ ½ÃÀÛ ÁöÁ¡À» °¢°¢ ±×¸¸Å­ ´õÇؼ­ ÁöÁ¤)
2. Áøôµµ Ç¥½Ã ¹× ÀϽÃÁßÁö ¹×  °è¼ÓÁøÇàó¸® ±â´É Ãß°¡

GPT ´äº¯ )
: ¸ÕÀú, Àüü ¶óÀÎÀ» ºÐÇÒÇÏ¿© ¿©·¯ ½º·¹µå¿¡¼­ ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÀÛ¾÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̸¦ À§Çؼ­´Â ÆÄÀÏÀÇ Àüü ¶óÀÎ ¼ö¸¦ ¼¼°í, ±× ¼ö¿¡ µû¶ó ÀûÀýÇÑ ¼öÀÇ ½º·¹µå·Î ºÐÇÒÇÕ´Ï´Ù. ±×·± ´ÙÀ½, °¢ ½º·¹µå°¡ ó¸®ÇØ¾ß ÇÒ ¶óÀÎ ¹üÀ§¸¦ °è»êÇÕ´Ï´Ù.

#-----------------------------------------
# ÆÄÀÏÀÇ Àüü ¶óÀÎ ¼ö °è»ê
$totalLines = Get-Content "./text.txt" | Measure-Object -Line | Select-Object -ExpandProperty Lines

# »ç¿ëÇÒ ½º·¹µå ¼ö ¼³Á¤ (¿©±â¼­´Â ¿¹½Ã·Î 4~6 »çÀÌÀÇ ½º·¹µå¸¦ »ç¿ë)
$threadCount = Get-Random -Minimum 4 -Maximum 7

# °¢ ½º·¹µå°¡ ó¸®ÇÒ ¶óÀÎ ¹üÀ§ °è»ê
$linesPerThread = [math]::Ceiling($totalLines / $threadCount)

# °¢ ½º·¹µåÀÇ ½ÃÀÛ ÁöÁ¡ °è»ê
$threadRanges = @()
$startLine = 1
for ($i = 1; $i -le $threadCount; $i++) {
    $endLine = [math]::Min($startLine + $linesPerThread - 1, $totalLines)
    $threadRanges += "$startLine-$endLine"
    $startLine = $endLine + 1
}
#-----------------------------------------

ÀÌÁ¦ $threadRanges ¹è¿­¿¡´Â °¢ ½º·¹µå°¡ ó¸®ÇØ¾ß ÇÒ ¶óÀÎÀÇ ¹üÀ§°¡ ÀúÀåµË´Ï´Ù.

: ´ÙÀ½À¸·Î, Áøôµµ Ç¥½Ã ¹× ÀϽÃÁßÁö/°è¼ÓÁøÇàó¸® ±â´ÉÀ» Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. À̸¦ À§Çؼ­´Â °¢ ½º·¹µå°¡ ¶óÀÎÀ» ó¸®ÇÒ ¶§¸¶´Ù ÁøÇà »óȲÀ» Ç¥½ÃÇÏ°í, ÇÊ¿äÇÑ °æ¿ì »ç¿ëÀÚ ÀÔ·ÂÀ» ¹Þ¾Æ ÀÛ¾÷À» ÀϽà ÁßÁöÇϰųª °è¼Ó ÁøÇàÇÕ´Ï´Ù.

#-----------------------------------------
# °¢ ½º·¹µå¿¡¼­ ÁøÇà »óȲÀ» Ç¥½ÃÇÏ°í »ç¿ëÀÚ ÀÔ·ÂÀ» ó¸®ÇÏ´Â ÇÔ¼ö Á¤ÀÇ
function ProcessLines {
    param (
        [string]$range
    )

    $startLine, $endLine = $range -split '-'

    for ($lineNumber = $startLine; $lineNumber -le $endLine; $lineNumber++) {
        # °¢ ¶óÀÎÀ» ó¸®ÇÏ´Â ÀÛ¾÷ ¼öÇà
        # ¿©±â¿¡ ½ÇÁ¦ ÀÛ¾÷ ³»¿ëÀ» Ãß°¡

        # ÁøÇà »óȲ Ç¥½Ã
        Write-Host "Processing line $lineNumber/$totalLines"

        # »ç¿ëÀÚ ÀÔ·Â È®ÀÎ (ÀϽà ÁßÁö ¶Ç´Â °è¼Ó ÁøÇà)
        $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown").Character
        if ($key -eq 'p') {
            # 'p' Å°¸¦ ´©¸£¸é ÀϽà ÁßÁö
            Write-Host "ÀÛ¾÷ÀÌ ÀϽà ÁßÁöµÇ¾ú½À´Ï´Ù. °è¼ÓÇÏ·Á¸é 'c'¸¦ ÀÔ·ÂÇϼ¼¿ä."
            do {
                $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown").Character
            } while ($key -ne 'c')
            Write-Host "ÀÛ¾÷À» °è¼ÓÇÕ´Ï´Ù."
        }
    }
}

# °¢ ½º·¹µå¸¶´Ù ÀÛ¾÷ ½ÃÀÛ
foreach ($range in $threadRanges) {
    Start-ThreadJob -ScriptBlock {
        param (
            [string]$range
        )
        ProcessLines $range
    } -ArgumentList $range
}

# ¸ðµç ½º·¹µå ÀÛ¾÷ÀÌ ¿Ï·áµÉ ¶§±îÁö ´ë±â
Get-Job | Wait-Job

# ¸ðµç ÀÛ¾÷ ¿Ï·á ÈÄ ½º·¹µå Á¾·á
Get-Job | Remove-Job
#-----------------------------------------

À§ÀÇ ¿¹Á¦¿¡¼­´Â °¢ ½º·¹µå°¡ °¢ ¶óÀÎÀ» ó¸®ÇÏ´Â °¡»óÀÇ ÀÛ¾÷À» ¼öÇàÇÏ°í, ±× °úÁ¤¿¡¼­ ÁøÇà »óȲÀ» Ç¥½ÃÇÏ°í »ç¿ëÀÚ ÀÔ·ÂÀ» ¹Þ½À´Ï´Ù. ½ÇÁ¦ ÀÛ¾÷¿¡ ¸Â°Ô ½ºÅ©¸³Æ®¸¦ ¼öÁ¤ÇϽʽÿÀ.
     
dateno1 03-05
½ÃÇèÇغ¸´Ï job »ý¼º ½Ãµµ¸¦ ÇÏ°í, Àüü¸¦ ÀÔ·ÂÇÑ ½º·¹µå ¼ýÀÚ¸¸Å­À¸·Î ³ª´©¾î¼­ »êÃâÇϴ°ͱîÁø Á¤»óÀε¥, Á¤ÀÛ Ã³¸®ÇؾßÇÒ ºÎºÐ¿¡ ³»¿ë Ãß°¡ÇØÁ൵ ÇØ´ç ³»¿ë ½ÇÇàÀº ¾È Çϳ׿ä
¹ÎÈ£¾ç 03-05
Group-Object °¡ ´Ù ÀÐ°í ¹­±â¶§¹®¿¡ ¿À·¡°É¸³´Ï´Ù.
Where-Object { $_.Count -gt 1 } ´Â ¿ÀÈ÷·Á º° ½Ã°£ ¾È°É¸±°Ì´Ï´Ù.
°¢ ´Ü°è¸¦ ÂÉ°³ º¯¼ö¿¡ ³Ö°í ½ÇÇàÀ» ÇÏ¸é ¿À·¡°É¸®´Â º´¸ñÀÌ ¾îµðÀÎÁö º¸ÀÏ°Ì´Ï´Ù.
a = Get-Content "./text.txt"
b = a | Group-Object
...
system32 03-05
python3 ·Î § ¼Ò½ºÀÔ´Ï´Ù.import os
import threading

class LineProcessor:
    def __init__(self, filename):
        self.filename = filename
        self.lock = threading.Lock()
        self.total_lines = 0
        self.processed_lines = 0
        self.duplicates = {}

    def count_lines(self):
        with open(self.filename, 'r') as file:
            for line_number, line in enumerate(file, start=1):
                self.total_lines += 1

    def process_lines(self, start=None, end=None):
        with open(self.filename, 'r') as file:
            if start:
                file.seek(start)
            if end:
                chunk_size = end - start
            else:
                chunk_size = os.path.getsize(self.filename)

            for _ in range(chunk_size):
                line = file.readline()
                if not line:
                    break
                self.processed_lines += 1
                if line in self.duplicates:
                    with self.lock:
                        print(f"Duplicate line '{line.strip()}' found at line number(s): {', '.join(map(str, self.duplicates[line]))}")
                else:
                    self.duplicates.setdefault(line, []).append(self.processed_lines)

    def process_chunk(self, start, end):
        self.process_lines(start, end)
        with self.lock:
            print(f"Processed chunk from {start} to {end}. Progress: {self.processed_lines}/{self.total_lines}")

def find_duplicates(filename, num_threads=4):
    processor = LineProcessor(filename)
    processor.count_lines()
    chunk_size = processor.total_lines // num_threads

    threads = []
    for i in range(num_threads):
        start = i * chunk_size
        end = (i + 1) * chunk_size if i < num_threads - 1 else None
        thread = threading.Thread(target=processor.process_chunk, args=(start, end))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    # print("Duplicate lines found:", processor.duplicates)

if __name__ == "__main__":
    filename = "text.txt"
    find_duplicates(filename)

³ª»ÚÁö ¾Ê°Ô °á°ú¸¦ ¹ñ¾îÁֳ׿ä.


QnA
Á¦¸ñPage 195/5682
2014-05   4952464   Á¤ÀºÁØ1
2015-12   1489001   ¹é¸Þ°¡
2023-06   1362   ±¸½ÊÆò
2023-07   1362   ¿µ»êȸ»ó
2022-11   1363   ÇãÀα¸¸¶Æ¾
2022-03   1363   ¸µ°í½ºÅ¸
2023-11   1363   yummy
04-19   1363   ¹Î°æ¿­
06-28   1363   witbox
2023-05   1363   ¾ÛÇÃÇÏ´ÂIng
2022-02   1363   º´¸ÀÆù
04-07   1364   ±è¹ÎöGC
2023-04   1364   À¯È£ÁØ
2023-02   1364   »ç¶ûÇ϶ó
09-01   1364   ¿øÅÊÀ̹汼ÀÌ
07-11   1364   ½¦À̵ù
2022-11   1364   ±îÄ¡»ê°³²ÜÅÊ
2023-11   1364   °ËÀºÄá
2022-02   1364   L2½ºÀ§Ä¡
2023-01   1364   ȸ¿ø
2021-12   1364   ¹é¹é
2023-05   1364   ťƼŬÁ¦°Å